讀古今文學網 > iOS編程基礎:Swift、Xcode和Cocoa入門指南 > 第7章 nib管理 >

第7章 nib管理

第4章介紹過獲取實例的方式。可以直接實例化一個對像類型:


let v = UIView
  

也可以獲取對已有實例的引用:


let v = self.view.subviews[0]
  

不過還有第3種方式:可以加載nib。nib是個特殊格式的文件,文件中是一些用於創建與配置實例的指令。加載nib實際上就是告訴nib遵循這些指令:它會創建並配置這些實例。

剛才提到的UIView實例就適合於使用這種方式創建,因為UIView常常都是通過nib創建的。我們在Xcode中通過圖形化界面來編輯nib,就像繪圖程序一樣。其想法是設計一些界面對像(幾乎都是UIView與UIView子類的實例),當應用運行時會使用到這些對象。當應用運行時,當真正開始需要這些界面對像時(通常是要在可視化界面中將其顯示出來),你會加載nib,nib加載過程會創建並配置實例,你會接收到這些實例並將其添加到應用的界面中。

創建界面對像不必非得使用nib。nib加載過程中所做的事情完全可以通過代碼完成。可以實例化UIView或UIView子類,配置它們,構建視圖層次體系,可以將該視圖層次體系添加到界面上,手工一步步完成,完全在Xcode中進行。nib只不過是一種讓這個過程變得更簡單、更便捷的方式而已。提前以圖形化方式設計好nib;當應用運行時,代碼不必實例化或配置任何視圖,只需加載nib並獲得生成的實例,然後將其放到界面中即可。實際上,由於你一定會用到視圖控制器(UIViewController),它們本身在設計時就考慮到了nib,因此你甚至都不用使用nib!視圖控制器會加載nib,獲取生成的實例,並將它們放到界面上,這一切都是自動完成的。

相比於編寫代碼,nib是一種簡單且精巧的方式,它使得設計與配置應用界面的過程變得更加簡單和便捷。不過,它們可能也是iOS編程中最不易理解的方面。很多初學者從開始學習iOS第一天就知道nib,並且一直使用了很多年,但卻不知道nib到底是什麼,其工作原理是什麼。這麼做是完全錯誤的。nib不是魔法,理解起來並不難。重要的是,你要知道nib是什麼,其工作原理是什麼,如何在代碼中操縱nib。沒有完全理解nib會導致你陷入各種低級、混亂的問題中;而實際上,只需掌握一些基本的知識就可以完全避免或糾正這些問題。這些都是本章將要介紹的主題。

nib有必要嗎?

從根本上來說,nib是實例之源,你可能想問是否可以不使用nib。這些實例也可以通過代碼生成,因此完全去除nib不也可以嗎?簡單的答案就是:是的,沒問題。我們完全可以編寫一個沒有.storyboard或.xib文件的複雜應用(我就這麼幹過)。不過,實際問題是如何做好平衡。大多數應用都至少會將nib文件作為一些界面對像之源;不過,有一些界面對像只能通過代碼來定制,有時從一開始就完全通過代碼來生成這些界面對像會更簡單。在實際開發中,項目可能會涉及一些代碼生成的界面對象與nib生成的界面對像(後者還可以通過代碼做進一步的修改或是配置)。

名字nib或nib文件與鋼筆或巧克力沒有任何關係。Xcode提供的圖形化nib設計器(稱為nib編輯器)過去(一直到Xcode 3.2.x)是個單獨的應用,叫作Interface Builder(Xcode中的nib編輯器環境依然被稱作Interface Builder)。Interface Builder所創建的文件擁有.nib文件擴展名,這是「NeXTStep Interface Builder」的首字母縮寫。時至今日,你在nib編輯器中直接編輯的文件要麼是.storyboard文件,要麼是.xib文件;在構建應用時,這些文件會被編譯到nib文件中(參見第6章)。