gpt4 book ai didi

ios - 协议(protocol)/委托(delegate)中 IBOutlet 的困难

转载 作者:行者123 更新时间:2023-11-30 11:47:55 24 4
gpt4 key购买 nike

我在使用 IBOutlets 时遇到困难。我试图允许用户在 TableView Controller (LoLAddGoalsTableViewController)中输入一个目标(称为 nameOfRewardText),然后当他们单击“完成”时,让该目标显示在不同 View Controller 中名为“currentGoalTextField”的标签中(LoLGoalViewController)。我一直在尝试使用 Save segue 来实现这一点,但建议使用带有委托(delegate)的协议(protocol)( Updating text in ViewController using Save function )。现在我已经用协议(protocol)和委托(delegate)替换了 Save segue,输入的“nameOfRewardText”文本没有显示在“currentGoalTextField”标签中,我怀疑是因为 IBOutlet 不再正确地绑定(bind)在一起。我附上了下面 Outlet 的代码和屏幕截图,以试图阐明我所在的位置。有谁知道我如何修复 IBOutlet 或者是否需要添加其他内容才能使其正常工作?我删除了将 nameOfRewardText.text 指定为 goal.goalText 的行,所以我认为 nameOfRewardText 没有被指定给 var goal?也许我为此文本使用了太多名称(nameOfRewardText、goalText 和 currentGoalTextField),这使事情变得复杂?任何帮助将不胜感激,因为我对此很陌生!谢谢大家!

这是结构目标:

import UIKit

struct Goal {
var goalText: String
var pointsToCompleteGoal: Int
var pointsEarnedTowardsGoal: Int
var repeatGoal: Bool

init(goalText: String, pointsToCompleteGoal: Int, pointsEarnedTowardsGoal: Int, repeatGoal: Bool = false) { //Made String non-optional. If issue later, can revert.
self.goalText = goalText
self.pointsToCompleteGoal = pointsToCompleteGoal
self.pointsEarnedTowardsGoal = pointsEarnedTowardsGoal
self.repeatGoal = repeatGoal
}
}

这是公共(public)协议(protocol):

import Foundation
import UIKit

protocol GoalDelegate: class {
func passGoal(_ goal: Goal?)
}

这是创建委托(delegate)的位置,正如您所看到的,我将 nameOfRewardText.text 指定为 goal.goalText 的语句现在消失了:

import UIKit

class AddGoalsTableViewController: UITableViewController {

var goal:Goal?
var delegate: GoalDelegate?

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// HASHED OUT THE BELOW BECAUSE REPLACING WITH DELEGATE:
// if segue.identifier == "SaveGoal" {
// let pointsNeededInt = Int(pointsNeededText.text!)
// let pointsEarnedInt = Int(goalProgressText.text!)
// goal = Goal(goalText: nameOfRewardText.text!, pointsToCompleteGoal: pointsNeededInt!, pointsEarnedTowardsGoal: pointsEarnedInt!)
// }

if let secondViewController = segue.destination as? LoLGoalViewController{
delegate = secondViewController
delegate?.passGoal(goal)
}
}

@IBOutlet var goalTableTitleText : UILabel!
@IBOutlet weak var goalProgressText: UILabel!
@IBOutlet weak var nameOfRewardText: UITextField!
@IBOutlet weak var pointsNeededText: UITextField!
@IBOutlet weak var repeatSwitch: UISwitch!


override func viewDidLoad() {
super.viewDidLoad()
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}

带有 Outlet 的 AddGoalsTableViewController 的屏幕截图: LoLGoalViewController

这里我遵守协议(protocol),调用函数passGoal:

import UIKit

class LoLGoalViewController: UIViewController, GoalDelegate {

@IBOutlet weak var currentGoalTextField: UILabel!

func passGoal(_ goal: Goal?) {
currentGoalTextField.text = goal?.goalText
}

override func viewDidLoad() {
super.viewDidLoad()
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}

extension LoLGoalViewController {

@IBAction func cancelToLoLGoalViewController(_ segue: UIStoryboardSegue) {
}
}

带有 Outlet 的 LoLGoalViewController 屏幕截图: LoLGoalViewController

最佳答案

您的 LoLGoalViewController View Controller 可能尚未完全加载其所有 socket 。添加我对上一个问题的回答,您可以在 LolGoalViewController 中声明另一个变量:

@IBOutlet weak var currentGoalTextField: UILabel!

var goalText: String = ""

在您的 passGoal 方法中,将字符串设置为 goalText 变量而不是标签的文本:

func passGoal(_ goal: Goal?) {
goalText = goal?.goalText
}

最后,在 LolGoalViewControllerviewDidLoad 中,将标签文本设置为 goalText:

override func viewDidLoad() {
super.viewDidLoad()

currentGoalTextField.text = goalText
}

关于ios - 协议(protocol)/委托(delegate)中 IBOutlet 的困难,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48632272/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com