这让我发疯了。正在调用函数execute
,由print语句验证,但它没有在我的视图控制器中设置标签,并且标签的print语句返回nil,即使它具有可见的默认值集加载应用程序时更令人困惑的是,我设置了一个单独调用此功能的测试按钮,当我用Show Project Dependency Diagram
调用它时,标签会正确更新。
updateTextView()
在弹出不同的视图控制器后,通过委托方法调用 test()
,如下所示:
class GoalDetailViewController: UIViewController, TextDelegate {
@IBAction func test(sender: AnyObject) {
updateTextView()
}
func updateTextView() {
print(goalSummaryTextBox?.text)
print("delegate called")
self.goalSummaryTextBox?.text = GoalsData.summaryText
print(goalSummaryTextBox?.text)
}
@IBOutlet weak var goalTitle: UILabel?
@IBOutlet weak var goalCreationDate: UILabel?
@IBOutlet weak var goalSummaryTextBox: UITextView?
override func viewDidLoad() {
super.viewDidLoad()
goalSummaryTextBox?.text = GoalsData.summaryText
}
}
答案 0 :(得分:0)
导致问题的一行位于以下TextEditViewController
:
textDelegate = GoalDetailViewController()
此行的作用是创建GoalDetailViewController
的新实例,并将其设置为TextEditViewController
的委托。但是,你想要的是GoalDetailViewController
的原始实例作为委托。这就是弹出TextEditViewController
时看到日志的原因,因为它正在执行另一个实例(它不是视图层次结构的一部分)。它还解释了为什么在委托调用中单步执行IBOutlet
时所有updateTextView()
都为零,并且您添加的按钮会正确更新文本。
解决方案是在prepareForSegue
方法中建立委托连接:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let destination = segue.destinationViewController as? TextEditViewController {
destination.textDelegate = self
}
}
将以上代码添加到GoalDetailViewController
。
编辑:
以下代码将确保将来不会发生此问题。将代理人的定义更改为:
weak var textDelegate: TextDelegate?
并将您的协议更改为:
protocol TextDelegate: class {
func updateTextView()
}