斯威夫特文本标签零即使有默认值
问题描述:
这让我疯狂。函数updateTextView()
被调用,由打印语句验证,但它没有在我的视图控制器中设置标签,并且标签的打印语句返回nil,即使它具有默认值集,当应用程序是加载。更令人困惑的是,我设置了一个测试按钮来单独调用此函数,当我用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
}
}
updateTextView()
正在通过委托方法称为后我弹出一个不同的视图控制器,如在下面可以看到:
class TextEditViewController: UIViewController {
var textDelegate: TextDelegate?
@IBOutlet weak var textView: UITextView?
func configureView() {
navigationItem.title = "Edit Description"
navigationItem.setRightBarButtonItem((UIBarButtonItem(barButtonSystemItem: .Done, target: self, action: "segue")), animated: true)
}
func segue() {
textDelegate = GoalDetailViewController()
if let text = textView?.text {
GoalsData.summaryText = text
}
textDelegate?.updateTextView()
self.navigationController?.popViewControllerAnimated(true)
}
}
答
线引起的问题是在下面的TextEditViewController
:
textDelegate = GoalDetailViewController()
该行所做的是创建一个新实例GoalDetailViewController
,并将其设置为TextEditViewController
的代表。但是,你想要的是GoalDetailViewController
的原始实例是代表。这就是您弹出TextEditViewController
时看到日志的原因,因为它正在执行另一个实例(它不是视图层次结构的一部分)。它还解释了为什么您在代理呼叫中通过updateTextView()
时所有IBOutlet
s都是零,并且您添加的按钮正确更新文本。
的解决方案是在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()
}
最后那句话可能是问题。 – tktsubota
能否详细说明一下?由于打印语句我知道它调用函数。 –
你可以发布与弹出的不同视图控制器有关的代码(并触发'updateTextView()'调用)吗?这可能是'updateTextView()'在后台队列上被调用。你还可以将'print(GoalsData.summaryText)'添加到'updateTextView()'来确保它确实不同吗? – Mark