IOS中的XIB

本文只適合初學(xué)者看,大神可以繞行,或者幫小弟補(bǔ)充

『我一直在想XIB到底是什么?其實XIB特別簡單,XIB就是nib轉(zhuǎn)變過來的!那么nib又是什么?如果說你是早期的開發(fā)人員,可能很清楚兩者之間的關(guān)系。但目前我對兩者的理解還很少。查了相關(guān)資料是這樣說的(引用了別人的資料)』

相同點:
nib 和 XIB 都是 Interface Builder 的圖形界面設(shè)計文檔。Interface Builder 把窗口、菜單欄以及窗口上的各種控件的對象都“凍結(jié)”在了一個 nib檔里面了;程序運行時,這些對象將會“蘇醒”。
不同點:
nib為二進(jìn)制文件,XIB為純文本文件,后者方便于版本控制和Diff。XIB 可編譯為 nib。

如果是你初學(xué)者,可能看著有點暈暈的。那么現(xiàn)在我們來看一下XIB是什么??我們?nèi)绾沃篮土私獾剿?/p>

一、初識XIB
新建XIB.png

在我們創(chuàng)一個項目時會看到User Interface,注意的是會出現(xiàn)一個空的視圖和一個帶view的視圖。當(dāng)我們點擊的任何一個文件的時候都會在項目中產(chǎn)生相關(guān)的XIB文件(注意:只是一個,這里為了展示效果,我創(chuàng)建出來了兩個)


XIB.png

那么問題來了
空的XIB和帶一個view的XIB有什么區(qū)別?
我個人在XIB的使用上不多,目前還真沒發(fā)現(xiàn)區(qū)別,但我想Xcode這樣設(shè)計肯定是有原因的,如果你有想法可以留言給我

創(chuàng)建好了,接下來XIB如何使用?

二、XIB的使用
  • 簡單理解:
    其實XIB在使用上非常類似storyboard(第一遍提到)。什么意思呢?storyboard是可以創(chuàng)建多個控制器或者是視圖,在工作職責(zé)上來看會有很多的作用。而XIB呢?實際是一個小視圖,更多是將帶有復(fù)雜性和有共性的問題單一處理掉。不知道我這么說你會不會理解。如果不是很清楚,那你就可以理解為:模板化(視圖)

這里說句題外話:學(xué)習(xí)IOS的時候,必須要保持一個思想,就是復(fù)雜問題簡單化,其實無論在學(xué)習(xí)和生活中,我們在遇到任何問題或者事情的時候都應(yīng)該有這樣的思維方式

  • 觀察一下界面:
    在使用上,XIB與storyboard非常類似(第二遍提到),一樣可以拖拉拽,去設(shè)置屬性以及相應(yīng)的方法。但當(dāng)你創(chuàng)建一個XIB的時候你會發(fā)現(xiàn)XIB的界面中右側(cè)(控制器或者控件的區(qū)域)控件會出現(xiàn)在最上面,而控制器呢?會出現(xiàn)在最下面,看下圖:
控件.png

控制器.png

很細(xì)微的舉動告訴我們。XIB與storyboard在工作的側(cè)重點是完全不一樣的。XIB更喜歡去添加控件,而storyboard則是喜歡去添加控制器。

『區(qū)別1:側(cè)重點不同,導(dǎo)致工作承擔(dān)的職責(zé)就不同』

  • 使用:

1、XIB在創(chuàng)建出來的時候,跟任何文件(類)都沒有關(guān)系,是一個單獨的文件,那么我們在XIB上所拖拉出來的控件,我們應(yīng)該如何去管理呢?又或者說如何去獲取到這些控件呢?
想想Xcode在創(chuàng)建一個空項目出來的時候是怎么做的,都有哪些文件,我們在storyboard中創(chuàng)建的控件又拖線到哪里去了呢?再仔細(xì)看看下面的圖??


storyboard.png

ViewController.png

沒錯,storyboard在創(chuàng)建出來的時候,身份檢測器中Class自動繼承了一個控制器,這個控制器正是我們在創(chuàng)建項目的時候系統(tǒng)給我們自帶的一個類。這說明什么?

說明一個storyboard就像每一個類一樣,在創(chuàng)建出來的時候都要指定一個Class來繼承一下

那么我們在創(chuàng)建一個XIB的時候,是不是也要這么做呢??沒錯,我們也需要創(chuàng)建一個類來管理我們自己單獨創(chuàng)建出來的XIB,管理就意味這在XIB中所拖拉出來的控件一定是放在這個類里的,去設(shè)置屬性和監(jiān)聽動作等等

『區(qū)別2:繼承管理問題:storyboard自帶繼承關(guān)系,有人管。而XIB在創(chuàng)建出來的時候沒有人管,需要我們單獨再創(chuàng)建一個類去繼承一下才能夠管理里面的控件屬性』

2、在使用storyboard的時候,我們不需要用代碼去告訴程序,「我要運行storyboard了」。我們可以直接運行(command + R)的方式去展示storyboard中添加好的控制器和控件即可。

而XIB就不是了,她需要我們來『喚醒』,這個詞可以在別的資料中也能看到,但怎么理解這個喚醒就不要太深究了。只理解為,我們必須要通過代碼來告訴程序xib也是我們需要加載的視圖:
『區(qū)別3:主動喚醒:沒人管就算了,還那么懶,必須還要叫醒』

三、XIB內(nèi)部實現(xiàn)問題

我們在管理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,幫助文件對這兩個參數(shù)是這么說的

  • 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,當(dāng)然firstObject也可以。這讓我們想到了數(shù)組。而幫助文件是這么解釋的

  • An array containing the top-level objects in the nib file.(字幕:請求翻譯~)
    我理解的是:其實XIB就是一個視圖,當(dāng)然我們不只放一個控件(或許會放一個),我們需要返回最頂部的一個對象給她,就好比OC里的數(shù)組第一個元素的地址就是這個數(shù)組的地址是一個意思。獲取到的最頂部對象就能代表這個XIB自身。那誰來接收這個對象呢?恰恰就是XIB的管理者來接收,下面就是通過類方法來調(diào)用
// 對照上面的類方法看一下
LoadXIBView *XIB = [LoadXIBView LoadXIB];

第二件事情:給XIB里的屬性進(jìn)行賦值(或重寫模型屬性的set方法)

在賦值的時候需要我們注意,XIB里的控件不只是一個,或許有按鈕,或許有圖片,或許還有別的等等……(一個數(shù)組)那么控件的數(shù)量是不是應(yīng)該跟我們從網(wǎng)絡(luò)(本地加載)的數(shù)據(jù)應(yīng)該是一一對應(yīng)的呢??也就是說,我們獲取到的數(shù)據(jù)和想展示的出來的控件應(yīng)該是對應(yīng)有值的。如果沒值,那就是nil 所以在我們賦值的時候,應(yīng)該是逐一賦值好呢?還是應(yīng)該把模型當(dāng)成自己的屬性,然后重寫屬性的set方法,然后在set里面給模型屬性賦值呢??

說到這,XIB的使用基本算是完成了,然后日后如果我有新的理解方式我會繼續(xù)更新的,這里先說到這些。接下來我們應(yīng)該想想,管理XIB的文件.h與.m中應(yīng)該怎么寫??寫些什么??(封裝加載XIB的類方法和模型屬性的set方法,引入模型作為屬性)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容