2010-11-14 50 views
4

我已閱讀Apple的「您的第一個iOS應用程序」指南,所有內容對我來說似乎都很清楚。但是,當我嘗試瞭解XCode中提供的基於View的iOS應用程序模板的工作原理時,我遇到了一些有趣的難題。基於視圖的iOS應用程序模板

據我所知,應用程序從主要的nib文件名(通常是MainWindow.xib)形成* -Info.plist文件。我不明白的是,默認情況下,XCode如何知道哪個nib文件與使用此基於View的應用程序模板創建的控制器相關聯。在指南中,你開始與基於Windows的應用程序,你「必須寫」是這樣的:

MyViewController *aViewController = [[MyViewController alloc] 
initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]]; 

[self setMyViewController:aViewController]; 

這是非常合情合理的。但是,事實證明,在基於視圖的iOS應用程序模板中沒有這樣的事情,並且這個nib規範並不是首先需要的,只要您創建了UIViewController子類並使用選項「With XIB for user interface 「檢查。我的問題是,XCode是如何知道哪個nib與這個控制器相關聯的,也就是說它是將這個連接存儲在一些文件中,還是通過某種約定(可能與控制器和nib文件同名)?此外,從'MyViewBasedAppController''的字幕加載來自哪裏MainWindow.xib中的控制器的接口生成器的視圖?當我手動添加控制器時,肯定不會出現這種情況,所以我很好奇XCode在我背後做了什麼魔術,當時我認爲我只是選擇了一個簡單的代碼模板。

回答

6

如果您查看目標信息(雙擊目標以使其顯示),'屬性'選項卡將顯示主要Nib文件的名稱。 'Nib'和'Xib'這兩個詞可以互換用於這些目的; Xib只是Nib的一個更新的選擇。

這將是'MainWindow'新鮮的模板。如果你打開MainWindow.xib,你會看到有一個名爲'[project name] App Delegate'的對象,如果你顯示檢查器並在'i'選項卡下選中,你會看到類型是在頂部命名。如果您檢查連接選項卡(右邊的箭頭),您會看到文件所有者(這是UIApplication本身)的「代理」屬性已附加。

您還會看到它有一個名爲'viewController'的插座。這附加到稱爲'[project name] View Controller'的xib中的另一個對象。檢查類型,你會發現它是Xcode添加到項目中的視圖控制器的類型。查看其屬性(檢查器中的第一個選項卡,使用滑塊圖形),您還會看到一個單獨的nib文件被指定爲包含其主要細節。

對於參數的緣故,假設我調用了我的項目'NibTest'並且沒有做任何更改。

在運行時,設備加載Info.plist。在那裏它看到代理是NibTestAppDelegate類型的。所以它會實例化類NibTestAppDelegate的一個實例,併爲其設置UIApplication的委託屬性。

然後,它會從MainWindow.nib中看到NibTestAppDelegate有一個名爲viewController的類型爲NibTestViewController的成員。所以它會創建一個實例並在它剛創建的NibTestAppDelegate實例上設置viewController屬性。

這樣做會打開另一個xib並繼續執行相同的步驟。

Objective-C具有完全反射的運行時,因此您可以在運行時通過它們的類名實例化對象。例如,這是Objective-C和C++之間的區別之一。

Xcode不生成任何隱藏代碼或依賴任何隱藏的命名約定。整個事情都是由操作系統在運行時弄清楚的。

編輯:例如,在你的地方例如:

MyViewController *aViewController = [[MyViewController alloc] 
initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]]; 

其實你可以這樣做:

MyViewController *aViewController = [[NSClassFromString(@"MyViewController") alloc] 
initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]]; 

爲MyViewController的程序或存在他們會相同,只要操作運行時間更長

您可以選擇將您喜歡的任何其他字符串對象傳遞給NSClassFromString。如果你想要的話,甚至可以向用戶詢問(儘管出於安全原因它會是一個非常糟糕的主意)。

+0

整個過程的優秀解釋,豎起大拇指。 – 2010-11-15 03:29:19

+0

嗯,你完全正確地從他們的名字實例化類,但那不是我所問的。你在這裏說的:「這樣做會打開另一個xib並繼續執行相同的步驟。」似乎沒有回答我的問題:如何解決NibTestViewController控制器的nib文件是非常NibTestViewController.xib文件?換言之,如何知道在這種情況下甚至應該有用於加載的nib文件(因爲我們可以清楚地實例化沒有nib文件的控制器)? – itim 2010-11-15 06:56:14

+0

「...查看其屬性(檢查器中的第一個選項卡,帶有滑塊圖形),您還會看到單獨的nib文件被指定爲包含其主要細節。」 - 對不起,我真的很累讀這個。這個答案實際上是指甲,非常感謝你! – itim 2010-11-15 09:21:56

相關問題