Swift文本标签即使有默认值也没有

时间:2016-02-29 04:50:52

标签: swift label viewcontroller

这让我发疯了。正在调用函数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
    }
}

1 个答案:

答案 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()
}