2012-07-20 187 views
2

我有兩個筆尖:Parent.xib和Child.xib。在nib中加載nib時,爲什麼awakeFromNib被調用兩次?

我已經在子筆尖內包含了子筆尖以簡化綁定。我在loadView中以編程方式設置子視圖。問題是,awakeFromNib在Child的控制器中被調用兩次。

我想我明白爲什麼會發生這種情況。當Parent完成加載時,它將awakeFromNib發送到它的對象,並且由於Child是其筆尖的文件所有者,因此它也會自行調用awakeFromNib。

我理解這個權利嗎?我原本以爲awakeFromNib每個實例只能調用一次。我不應該將筆尖嵌入筆尖嗎?

見樣本項目:https://github.com/panupan/AwakeFromNibTest

回答

4

在有些情況下awakeFromNib可以被稱爲比每個實例一次,如一個你設置。另一種情況是加載多個筆尖對象的控制器。如果你真的想要,你可以解決這個問題,但更好的設計是不需要的。來自NSNibAwaking Protocol Reference

建議您在文件所有者對象及其關聯的nib文件之間保持一對一的對應關係。使用相同的File's Owner對象加載兩個nib文件會導致該對象的awakeFromNib方法被調用兩次,這可能會導致某些數據結構以不希望的方式重新初始化。還建議您避免從awakeFromNib方法實現中加載其他nib文件。

在您的特定示例中,沒有理由將一個nib文件嵌入到另一個文件中。如果沒有將所有對象都放在一個單獨的nib文件中的便利性,您將無法將它們都加載到內存中,從而導致內存佔用不足。您應該將它們拆分並在nib文件中使用NSObjectController實例來處理它們之間的綁定。

+0

假設我想在兩個nib中使用NSObjectController。鏈接它們的最好方法是通過代碼綁定它們嗎?我將一個筆尖嵌入另一個筆尖的原因是無需編寫代碼即可實現綁定。謝謝。 – panupan 2012-07-21 02:00:27

+0

您爲'NSObjectController'實例創建一個'IBOutlet'。然後在'awakeFromNib'中使用'-setContent:'將對象控制器綁定到您希望它在另一個nib文件中表示的對象。在Interface Builder中,您可以設置控制器代表的對象的類以及您將使用的任何鍵。然後,您可以使用綁定到您的nib文件中的對象控制器,就好像它是原始對象一樣。在IB中,將控制器鍵設置爲「選擇」,並將模型鍵路徑設置爲原始對象上的任何鍵。 – 2012-07-21 08:17:14

+0

謝謝,我會給它一個鏡頭。 – panupan 2012-07-21 13:56:53