2009-05-25 52 views
3

作爲一個新手,IB和所有可能的連接都讓我感到困惑。我發現的大多數教程都是我稱之爲意大利麪代碼的轉世,其中糾纏是所有通過拖動創建的連接。當然,我想用IB來佈置視圖(設置可視元素的大小爲&),這就是IB很棒的原因。但是一個控制器不是一個視圖,所以如果我的所有控制器都是代碼並且不出現在IB中的任何位置,那麼它就不那麼令人困惑了。我懷疑這會減少意大利麪。它還鼓勵每個視圖提供一次警告。爲此,以下是問題,我在哪裏可以找到符合此策略的示例項目?如何讓控制器脫離xib

回答

1

好問題。我試圖堅持的模式是在代碼中創建控制器,爲XIB/NIB中與代碼交互的事物添加IBOutlets和IBActions,並在控制器的構造函數中加載XIB/NIB爲「self」的事物爲所有者和IB中的東西連接到「文件所有者」佔位符,我的身份將被指定爲我的控制器類。

4

我沒有一套示例項目,但我會給你提供一些有關事情如何工作以及何時應該在XIB文件或代碼中創建控制器的信息。

如果您的控制器是通過用戶操作動態創建的,那麼您通常不會在XIB文件中實例化它們。相反,你會像上面提到的危害一樣在代碼中實例化它們。一旦你這樣做了,你仍然需要一種機制將這個在代碼中創建的控制器連接到你在IB中創建的用戶界面元素。

IB提供解決此問題的機制是文件所有者。掌握文件的所有者對於「獲取」Interface Builder是必不可少的。

該文件的所有者不是「在」XIB文件中的對象,而是在XIB文件中表示的對象。它是加載XIB文件時已經存在的對象的佔位符。當運行時加載NIB文件時,它們將加載NSBundle方法 - [NSBundle loadNibNamed:ownwer:options:]。 owner參數用於解析XIB/NIB文件中文件的所有者佔位符對象。當文件在運行時加載時,針對文件所有者的所有連接將針對作爲owner參數傳入NSBundle方法的對象進行解析。在iPhone上,你通常不會自己加載NIB文件。相反,UIViewController爲你做。 UIViewController的方法的loadView的默認實現可能是這個樣子:

- (void)loadView { 
    [[self nibBundle] loadNibNamed:[self nibName] owner:self options:nil]; 
} 

所以,在你的XIB文件到文件的所有者連接的元素,你將它們連接到您的視圖控制器。

您將有一些控制器靜態地在您的應用程序中 - 他們將永遠活着。導航或選項卡控制器及其根項目通常在其應用程序的整個生命週期內都存活。當這種情況發生時,我會在MainWindow.xib文件中設置這些視圖控制器。大多數其他控制器將動態創建,並以編程方式響應用戶的操作。

+0

謝謝喬恩,這是有用的信息。我仍然想嘗試在IB方從未擁有控制器的策略。你會同意它是可行的嗎?我仍然在尋找代碼示例... – bedouger 2009-05-26 11:41:11