2015-10-15 37 views
0

我創建的UIView class AView: UIView的子類,拖動一個UIView到故事情節UIViewController界面生成器文件,更改類名AView,然後我拖累AView另外2個UIView小號分配標籤10,11何時/何處UIView的子視圖是從故事板初始化的?

我的問題是當兩個子視圖都是創建的初始化

class AView: UIView{ 
    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     print(self.subviews) 
    } 
    override func layoutSubviews() { 
     super.layoutSubviews() 
     print(self.subviews) 
    } 
    override func awakeFromNib() { 
     super.awakeFromNib() 
     print(self.subviews) 
    } 
} 

只有layoutSubviews打印子視圖。當然應該是。正如文檔所述,似乎在此方法之前創建了子視圖:

此方法的默認實現在iOS 5.1和更早版本上不做任何操作。否則,默認實現使用您設置的任何約束來確定任何子視圖的大小和位置。 子類可以根據需要重寫此方法以執行其子視圖的更精確佈局。只有在子視圖的自動調整大小和基於約束的行爲不提供所需行爲的情況下,才應該重寫此方法。您可以使用您的實現直接設置子視圖的框架矩形。

另一個問題,如果super.layoutSubviews()是必要的?

回答

0

加載nib文件時,首先發生的是單個對象首先被加載,並且initWithCoder被髮送給它們以便它們可以被初始化。請注意,對象圖表尚未連接到此處。這是確切的原因,如果您嘗試在init中訪問子視圖,您將找不到任何子視圖。對於這個視圖調用awakeFromNib的情況也是如此,這只是一個表明視圖現在已經加載了,但目前還沒有連接對象圖。

要在awakeFromNib-

在筆尖加載代碼調用awakeFromNib方法的對象的 不能保證訂單報價文檔。在OS X中,Cocoa嘗試調用文件所有者的awakeFromNib方法 last,但不保證 行爲。如果您需要在加載時進一步在您的筆尖文件 中配置對象,則最適合的時間是在您的 筆尖加載調用返回之後。那時,所有的對象都是 創建,初始化,並可以使用。

系統調用layoutSubviews之前,它可以實際呈現它們或發現需要一個reorg,在這裏所有的對象圖將通過筆尖加載過程連接。所以,你可以在這裏訪問任何視圖,並通過覆蓋來定位/調整它的大小。在做任何改變之前調用super.layoutSubviews非常重要。

現在來的時候正好所有的觀點被初始化並供我訪問的問題 -

  1. 如果我們通過視圖控制器加載,然後viewDidLoad中是地方從筆尖每個對象已裝入並且所有插座已連接等。
  2. 如果我們自己加載筆尖,則只有在筆尖加載調用返回後才能進行。
+0

看起來這是不正確的,即使我連接仍然打印無AView的子視圖。即使我沒有連接,必須有一個時間子視圖被初始化,連接只是一個參考,不是嗎? –

相關問題