2017-08-07 19 views
0

我遇到的問題是瞭解當我調用prepare(forSegue:)方法時發生了什麼。我得到的數據通過從MainVeiwControllerSecondViewController的機制。特別是在傳遞價值時,我無法從MainViewController初始化SecondViewController的@IBOUTLET,但我可以初始化其他可選屬性,如SecondViewControllervar name:String?。只是有點好奇。Prepare的生命週期(forSegue:....)

進一步闡述的問題:

爲主要類別查看:

class MainViewController:UIViewController{ 
    .. 
    .. 
    .. 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if let yourVC = segue.destinationViewController as? SecondViewController { 
     // this doesn't throw any error 
     yourVC.someData = self.someData 

     // this throws an error 
     yourVC.textLabel.text = self.someData 

     } 
    } 
} 

類爲第二個視圖:

class SecondViewController:UIViewController{ 

@IBOULET weak var textLabel:UILabel! 
var someData:String? 
.. 
.. 
.. 
} 
+0

請您澄清一下你的問題是解釋你認爲不應該發生的事情,或者你認爲應該發揮作用的不正常工作? – dasblinkenlight

+0

你試圖分配給插座的價值是什麼? –

+0

您無法訪問IBOutlets,因爲視圖尚未加載。嘗試在'prepareForSegue'目標視圖控制器上調用'loadViewIfNeeded',然後訪問IBOutlets – Paulw11

回答

0

當創建一個UIViewController實例時,它不包含任何視圖(除非您自己在初始化程序中添加它們 - 請勿這樣做)。

當的viewController即將被呈現在第一次,它會檢查是否viewnil與否,如果它是零,這將其自身從筆尖或情節串連圖板加載和注入視圖的viewController並調用viewDidLoad(_:)對你來說,因此在prepare(forSegue:)系統只爲你實例化一個viewController(基於segue的目標類型),你必須配置它的data,而不是它的意見。如果你想控制視圖,你可以調用loadViewIfNeeded()這將強制viewController加載它的視圖(這是一個反模式,如果它是唯一的選擇使用它)。

通常,這是它是如何做:

您定義一些變量,這些變量從外部設定。例如:var someString: String!,它告訴編譯器忽略該值是否爲零(或者如果您願意,可以設置一些默認值)。在您的viewDidLoad()方法中,將它們分配給您知道的相關視圖。

我們知道,這有點打破OOD,但是這是你當你使用故事板唯一的選擇,因爲系統是負責實例化和加載/卸載的意見/ viewControllers。如果你想幹淨地編碼,你可以定義一個viewController並將它的視圖設置爲nib,並在初始化器中處理所有這些事情。 (但要小心,您必須遵守加載視圖,卸載視圖或...的系統規則,因爲這些任務的處理和內存消耗很高,所以這就是爲什麼它們以這種方式定義的原因)

+0

感謝您的幫助。 – Biken

+0

我錯過了一件事,如果你在代碼中初始化一個viewController,它也可以與故事板一起工作,我說我的答案中的'nib'就是一個例子 – farzadshbfn

0

viewDidLoadSecondViewController總是叫prepare(forSegue:)左右的時間內prepare(forSegue:)所有IBOutlet S的SecondViewController尚未連接,無法訪問。

+0

所以其他屬性 - 'SecondViewController'的'var someData:String?'被連接,然後在'prepare(forSegue:)'中? – Biken

+0

是的,但屬性永遠不會*連接*。具有其屬性的視圖控制器實例是**初始化的**,但關聯的視圖不是**加載**(還)。 – vadian