2017-07-28 32 views
0

我知道有很多相關的問題,爲什麼awakeFromNib在實例化某些視圖時未被調用。 某些視圖從Nib喚醒的消息被髮送到視圖本身,並且此消息未傳遞給文件所有者。 我看到了Why won't my awakeFromNib fire?處理文件的所有者對象awakeFromNib

那麼,如果您創建一個視圖的實例,其文件所有者本身在xib文件中會發生什麼?

換句話說,您有自己的名爲MyCustomView.swift和MyCustomView.xib的自定義視圖。在xib文件中,您將文件的所有者設置爲MyCustomView。 那麼,當你創建MyCustomView的實例時,awakeFromNib會被調用嗎? 在我的情況下,awakeFromNib似乎沒有被調用。 但是,視圖本身是真正實例化的。所以,對我來說,奇怪的是awakeFromNib沒有被調用。

任何人都可以解釋這件事嗎?

供參考: 我準備BaseCustomView.swiftBaseCustomView有兩個init

override init(frame: CGRect) { 
     super.init(frame: frame) 
     commonInit() 
    } 

required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     commonInit() 
    } 

而且commonInit()是這樣的。

private func commonInit() { 
     // load custom view's xib 
     let bundle = Bundle(for: type(of: self)) 
     let nib = UINib(nibName: self.className(), bundle: bundle) 
     let view = nib.instantiate(withOwner: self, options: nil).first as! UIView 
     addSubview(view) 

     // make custom view's size the same size with itself 
     view.translatesAutoresizingMaskIntoConstraints = false 
     let bindings = ["view": view] 
     addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[view]|", 
      options:NSLayoutFormatOptions(rawValue: 0), 
      metrics:nil, 
      views: bindings)) 
     addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[view]|", 
      options:NSLayoutFormatOptions(rawValue: 0), 
      metrics:nil, 
      views: bindings)) 
    } 

而customView只是覆蓋此BaseCustomView的類。 另外,customView的文件所有者本身是customView。編輯: 自定義視圖類是這樣的。實際上並沒有調用awakeFromNib()

final class MyCustomView: BaseCustomView { 

    override func awakeFromNib() { 
    // do something 
    } 

} 
+0

你能告訴你如何實例化MyCustomView嗎?我想如果你直接創建一個'MyCustomView.swift'的實例,它將不會被調用,一些'init'將被調用。 – zero

+0

我展示了幾乎所有的代碼,請參閱。 –

+0

在你顯示的代碼中沒有'awakeFromNib'的實現。因此說它沒有被調用是沒有意義的。它沒有被叫,因爲它不在那裏。或者,如果它在那裏,_show_它(並顯示「there」在哪裏)。 – matt

回答

0

筆尖中的「文件所有者」項有點特別:它不是真實的對象,因爲其他項目是。這是一個佔位符,這是填寫一個預先存在的對象when the nib is instantiated

所以,文件的所有者並沒有像其他對象一樣從筆尖「醒來」。它在之前被創建筆尖被解除存檔。因此,收到awakeFromNib並不合理。

+0

是的,文件所有者對象是Apple官方文檔描述的唯一佔位符。所以,File's Owner不是從Nib中喚醒的。但是,在我的代碼中,'view'對象確實是從Nib喚醒的。所以,我認爲'awakeFromNib()'應該被調用。所以,在我自己,我有兩個對象。一個是文件的所有者,另一個是查看。當啓動File's Owner時,不調用'awakeFromNib()'。另一方面,在執行視圖時,應該調用'awakeFromNib()'。 –