2016-02-29 26 views
0

這讓我瘋狂。函數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

回答

0

線引起的問題是在下面的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