本文只適合初學者看,大神可以繞行,或者幫小弟補充
『我一直在想XIB到底是什么?其實XIB特別簡單,XIB就是nib轉變過來的!那么nib又是什么?如果說你是早期的開發人員,可能很清楚兩者之間的關系。但目前我對兩者的理解還很少。查了相關資料是這樣說的(引用了別人的資料)』
相同點:
nib 和 XIB 都是 Interface Builder 的圖形界面設計文檔。Interface Builder 把窗口、菜單欄以及窗口上的各種控件的對象都“凍結”在了一個 nib檔里面了;程序運行時,這些對象將會“蘇醒”。
不同點:
nib為二進制文件,XIB為純文本文件,后者方便于版本控制和Diff。XIB 可編譯為 nib。
如果是你初學者,可能看著有點暈暈的。那么現在我們來看一下XIB是什么??我們如何知道和了解到她
一、初識XIB
在我們創一個項目時會看到User Interface,注意的是會出現一個空的視圖和一個帶view的視圖。當我們點擊的任何一個文件的時候都會在項目中產生相關的XIB文件(注意:只是一個,這里為了展示效果,我創建出來了兩個)
那么問題來了
空的XIB和帶一個view的XIB有什么區別?
我個人在XIB的使用上不多,目前還真沒發現區別,但我想Xcode這樣設計肯定是有原因的,如果你有想法可以留言給我
創建好了,接下來XIB如何使用?
二、XIB的使用
- 簡單理解:
其實XIB在使用上非常類似storyboard(第一遍提到)。什么意思呢?storyboard是可以創建多個控制器或者是視圖,在工作職責上來看會有很多的作用。而XIB呢?實際是一個小視圖,更多是將帶有復雜性和有共性的問題單一處理掉。不知道我這么說你會不會理解。如果不是很清楚,那你就可以理解為:模板化(視圖)
這里說句題外話:學習IOS的時候,必須要保持一個思想,就是復雜問題簡單化,其實無論在學習和生活中,我們在遇到任何問題或者事情的時候都應該有這樣的思維方式
- 觀察一下界面:
在使用上,XIB與storyboard非常類似(第二遍提到),一樣可以拖拉拽,去設置屬性以及相應的方法。但當你創建一個XIB的時候你會發現XIB的界面中右側(控制器或者控件的區域)控件會出現在最上面,而控制器呢?會出現在最下面,看下圖:
很細微的舉動告訴我們。XIB與storyboard在工作的側重點是完全不一樣的。XIB更喜歡去添加控件,而storyboard則是喜歡去添加控制器。
『區別1:側重點不同,導致工作承擔的職責就不同』
- 使用:
1、XIB在創建出來的時候,跟任何文件(類)都沒有關系,是一個單獨的文件,那么我們在XIB上所拖拉出來的控件,我們應該如何去管理呢?又或者說如何去獲取到這些控件呢?
想想Xcode在創建一個空項目出來的時候是怎么做的,都有哪些文件,我們在storyboard中創建的控件又拖線到哪里去了呢?再仔細看看下面的圖??
沒錯,storyboard在創建出來的時候,身份檢測器中Class自動繼承了一個控制器,這個控制器正是我們在創建項目的時候系統給我們自帶的一個類。這說明什么?
說明一個storyboard就像每一個類一樣,在創建出來的時候都要指定一個Class來繼承一下
那么我們在創建一個XIB的時候,是不是也要這么做呢??沒錯,我們也需要創建一個類來管理我們自己單獨創建出來的XIB,管理就意味這在XIB中所拖拉出來的控件一定是放在這個類里的,去設置屬性和監聽動作等等
『區別2:繼承管理問題:storyboard自帶繼承關系,有人管。而XIB在創建出來的時候沒有人管,需要我們單獨再創建一個類去繼承一下才能夠管理里面的控件屬性』
2、在使用storyboard的時候,我們不需要用代碼去告訴程序,「我要運行storyboard了」。我們可以直接運行(command + R)的方式去展示storyboard中添加好的控制器和控件即可。
而XIB就不是了,她需要我們來『喚醒』,這個詞可以在別的資料中也能看到,但怎么理解這個喚醒就不要太深究了。只理解為,我們必須要通過代碼來告訴程序xib也是我們需要加載的視圖:
『區別3:主動喚醒:沒人管就算了,還那么懶,必須還要叫醒』
三、XIB內部實現問題
我們在管理XIB的文件中要告訴程序兩件事情
- 加載XIB
- 給XIB里的控件賦值(重寫模型屬性的set方法)
第一件事情:加載XIB
+ (instancetype)LoadXIB {
return [[[NSBundle mainBundle] loadNibNamed:@"XXX" owner:nil options:nil] lastObject];
//xxx是XIB的名稱
}
這句代碼分解4部分:(return就不解釋了)
1、[NSBundle mainBundle] :是專門加載路徑的一句代碼,如果想加載別的也可以使用這句,比如:
NSString *path = [[NSBundle mainBundle] pathForResource:@"xxx.plist" ofType:nil]
2、loadNibNamed:@"XXX" 加載路徑里的NIB名稱為:@"XXX"
3、owner:nil options:nil] 基本都為nil,幫助文件對這兩個參數是這么說的
- owner:
The object to assign as the nib’s File's Owner object(字幕:請求翻譯~) - options
A dictionary containing the options to use when opening the nib file. For a list of available keys for this dictionary, see Nib File Loading Options.(字幕:請求翻譯~)
4、 lastObject] 這個就有意思了。為什么是lastObject,當然firstObject也可以。這讓我們想到了數組。而幫助文件是這么解釋的
- An array containing the top-level objects in the nib file.(字幕:請求翻譯~)
我理解的是:其實XIB就是一個視圖,當然我們不只放一個控件(或許會放一個),我們需要返回最頂部的一個對象給她,就好比OC里的數組第一個元素的地址就是這個數組的地址是一個意思。獲取到的最頂部對象就能代表這個XIB自身。那誰來接收這個對象呢?恰恰就是XIB的管理者來接收,下面就是通過類方法來調用
// 對照上面的類方法看一下
LoadXIBView *XIB = [LoadXIBView LoadXIB];
第二件事情:給XIB里的屬性進行賦值(或重寫模型屬性的set方法)
在賦值的時候需要我們注意,XIB里的控件不只是一個,或許有按鈕,或許有圖片,或許還有別的等等……(一個數組)那么控件的數量是不是應該跟我們從網絡(本地加載)的數據應該是一一對應的呢??也就是說,我們獲取到的數據和想展示的出來的控件應該是對應有值的。如果沒值,那就是nil 所以在我們賦值的時候,應該是逐一賦值好呢?還是應該把模型當成自己的屬性,然后重寫屬性的set方法,然后在set里面給模型屬性賦值呢??
說到這,XIB的使用基本算是完成了,然后日后如果我有新的理解方式我會繼續更新的,這里先說到這些。接下來我們應該想想,管理XIB的文件.h與.m中應該怎么寫??寫些什么??(封裝加載XIB的類方法和模型屬性的set方法,引入模型作為屬性)