2011-03-15 59 views
3

我不理解nib文件與將文件所有者設置爲viewcontroller子類的作用。如果我將nib的文件所有者設置爲我的子類,那麼當我實例化子類時,nib似乎會加載它的所有子視圖。爲什麼我需要initWithNib?initWithNib vs將文件所有者設置爲viewcontroller子類

在另一種情況下,我注意到當我在一個筆尖內創建一個tableview,向tableview添加一個搜索欄並將文件所有者設置爲uitableviewcontroller的子類時,除非使用initWithNib,否則搜索欄不會顯示。爲什麼我需要initWithNib在這種情況下,當我不在以前?

回答

4

我很難理解你的問題。

-initWithNibName:bundle:是UIViewController的指定初始值設定項。如果需要,您可以將nil傳遞給nib名稱和包,在這種情況下,默認行爲是查找與應用程序包中的視圖控制器子類名稱相同的.xib文件。因此,擁有相同名稱的視圖控制器和.xib並不常見,並且只需將名稱和包名傳遞給零即可。但是,您可以有幾個不同的筆尖,都可以使用相同的視圖控制器子類。例如,您可能將一個筆尖沿縱向放置,另一個放在橫向上,然後根據設備的方向決定使用哪一個。

文件所有者是nib中的一個對象,它是加載nib文件的對象的代理。您可以(也應該)設置其類型,以便Interface Builder知道加載文件的對象可以提供哪些插口和操作,從而可以連接到文件的所有者代理。當應用程序運行並且一個對象加載一個筆尖時,該筆尖內連接到文件所有者的任何對象將通過連接到加載該文件的對象來實現。這是nib內部的對象可以與應用程序的其餘部分進行通信的主要機制。因此,儘管文件的所有者和-initWithNibName:bundle:都在加載一個筆尖中發揮作用,他們是非常不同的角色,並且大多是正交的。如果您成功調用了一些視圖控制器,並發現無論如何都加載了nib,則可能是-init調用了-initWithNibName:bundle:並且兩個參數均爲nil,如上所述。

0

有一個回退邏輯,它使用視圖控制器類的名稱作爲查找nib的默認值。這就是爲什麼你不必明確提供 - 只要名稱一致,系統會爲你找到它。另一方面,如果您選擇給您的筆尖使用不同的名稱,那麼您可能會發現initWithNib有用。

相關問題