斯威夫特文本标签零即使有默认值

斯威夫特文本标签零即使有默认值

问题描述:

这让我疯狂。函数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) 
    } 
} 
+1

最后那句话可能是问题。 – tktsubota

+0

能否详细说明一下?由于打印语句我知道它调用函数。 –

+0

你可以发布与弹出的不同视图控制器有关的代码(并触发'updateTextView()'调用)吗?这可能是'updateTextView()'在后台队列上被调用。你还可以将'print(GoalsData.summaryText)'添加到'updateTextView()'来确保它确实不同吗? – Mark

线引起的问题是在下面的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() 
} 
+0

谢谢。在一个侧面说明,这是一直在努力:与视图控制器的特定实例进行通信。 prepareForSegue是与特定实例交谈的唯一方式?并非常感谢你的完美作品 –

+0

使用故事板时,它是将两个视图控制器链接在一起的最简单方法之一。 – Mark

+0

如果这解决了您的问题,请将其标记为正确。 – Mark