IOS中的XIB

本文只適合初學者看,大神可以繞行,或者幫小弟補充

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

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

如果是你初學者,可能看著有點暈暈的。那么現在我們來看一下XIB是什么??我們如何知道和了解到她

一、初識XIB
新建XIB.png

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


XIB.png

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

創建好了,接下來XIB如何使用?

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

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

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

控制器.png

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

『區別1:側重點不同,導致工作承擔的職責就不同』

  • 使用:

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


storyboard.png

ViewController.png

沒錯,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方法,引入模型作為屬性)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,786評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,656評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,697評論 0 379
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,098評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,855評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,254評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,322評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,473評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,014評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,833評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,016評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,568評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,273評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,680評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,946評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,730評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,006評論 2 374

推薦閱讀更多精彩內容