2016-05-10 52 views
0

我想了解一個視圖控制器的生命週期,我已經讀了幾條關於awakeFromNib的矛盾聲明。該文件說,所有網點應設置在awakeFromNib,但I see that it's not always trueawakeFromNib,prepareForSegue之間的電話訂單是什麼時間?awakeFromNib vs Outlets - 當我們調用awakeFromNib時設置插座和segues

+0

在UIView生命週期中使用'awakeFromNib'更常見。但是您要查找的順序是'prepareForSegue','awakeFromNib','viewDidLoad'您可以訪問awakeFromNib中的插座,但是您應該先閱讀需要首先嚐試訪問視圖控制器視圖的警告。所謂的「破解」另一個問題的海報就是感嘆。在'viewDidLoad'中設置視圖控制器更安全,更標準。 – beyowulf

+0

謝謝!所以如果我們需要完全初始化的視圖和插座,我們用[self view]開始awakeFromNib –

+0

這就是objective-c。在swift中,你可以說'print(self.view)',這有點荒謬,這也是我推薦使用'viewDidLoad'的原因。 – beyowulf

回答

0

您的視圖控制器及其視圖層次結構是在運行時從單獨的nib文件加載的。視圖層次結構的出口在加載視圖層次結構之前不會連接,這發生在視圖控制器加載後。 (我已經更深入地解釋了這個問題in this answer。)

假設你在導航控制器中有一個「主」視圖控制器。主視圖控制器執行segue來推動「詳細」視圖控制器。這裏是事件的順序:

  1. 細節視圖控制器從它的筆尖加載。如果故事板場景包含其他頂級對象,則這些對象也將被加載。

  2. 詳細視圖控制器接收到awakeFromNib:詳細視圖控制器的插座連接到場景中的其他頂層對象,但是視圖層次結構的插座不是。

  3. 主視圖控制器接收到prepareForSegue,segue指向詳細視圖控制器。

  4. 塞格要求導航控制器推動詳細視圖控制器。

  5. 導航控制器詢問詳細視圖控制器的視圖,以添加到導航控制器的視圖層次結構中。

  6. 細節視圖控制器加載其視圖層次結構的筆尖。這將詳細視圖控制器的插座連接到其視圖層次結構。

  7. 視圖層次結構中的所有對象都會收到awakeFromNib

  8. 詳細視圖控制器收到viewDidLoad