[[NSBundle mainBundle] loadNibNamed:(NSString *) owner:(id) options:(NSDictionary *)];
那我就來說說這個函數內部, 蘋果官方解析的相信過程吧
爲了方便解釋, 我還是附上圖片吧
- (NSArray *)loadNibName(NSString *)name owner:(id)owner options:(NSDictionary *)options
{
// 首先會相信解析name.xib下的所有Object對象 (xib其實是xml 文件)
創建name.xib下的Object所以對象
這裏我就已第一個對象View來模擬xib的解析
解析View的各個屬性來創建第一個“我是按鈕”所在的這個UIView
解析過程如下:
// 創建一個View
UIView *view = [[UIView alloc] init];
// 設置view的各個屬性
view.backgroundColor = [UIColor blueColor];
......
// 創建一個按鈕
UIButton *button = [[UIButton alloc] init];
// 設置按鈕各個屬性
...
// 添加按鈕到view上
[view addSubview: button];
// 創建其他的兩個控件並解析控件設置其屬性
}
注意: 上面那個函數返回的是一個數組, 所以需要用到那個對象注意其下標
通過上面那個函數只是簡單的加載xib視圖, 要想對裏面的控件進行拖線, 或者監聽 就要設置xib裏面的File's Owner
現在我先來說一下設置File's Owner前後的差別吧, 爲此, 我先創建一個UIView的類來供“我是按鈕”所在的這個UIView連線使用, 並且給這個類聲明並實現了對象方法 - (IBAtion)buttonCilck; 如圖
現在設置xib的File's Owner的Custom Class的實力對象爲我們創建的MyView, 並且通過連線監聽按鈕點擊
如下圖代表連線成功 , 就可以監聽按鈕點擊事件了
然後通過在ViewController.m文件的- (void)viewDidLoad 方法寫 代碼加載xib
現在我來演示一個初學者常見的錯誤
注意: 上圖箭頭所指的owner 並不是我們xib裏面的File's Owner, 當前爲nil; 現在運行程序, 程序可以正常運行, 但是點擊“我的按鈕”, 程序就立馬崩潰了
因爲當前按鈕已經有點擊事件了, 點擊按鈕時, 會調用owner的buttonClick方法, 當前owner爲nil 所以會出錯
因爲owner的類型爲(id),所以這裏我創建一個Dog類來監聽點擊, 並讓Dog類聲明和實現- (IBAtion)buttonClick;方法
, 然後通過設置File's Owner的Custom Class的class爲 Dog使我們的狗可以監聽按鈕點擊
然後創建一條狗dog 並令owmer的參數爲dog
然後運行程序(command + R)
運行後,點擊按鈕還是會崩潰,這次顯示的原因和上次一樣,並不是我們這個方法錯了, 而是我們創建的這條是局部變量,這個函數運行完就銷燬了, 所以我們要給控制器設置一個dog屬性,來解決這個問題
現在運行程序就不會有問題了,點擊一下按鈕 狗就會監聽到 輸出 汪汪汪.....
現在我來總結一下File's Owner的使用步驟
1> 在xib中設置File's Owner的class 屬性(目的是爲了在xib中能找到owner的方法)
2> 建立File's Owner跟控件之間的聯繫(拖線)
3> 利用代碼加載xib, 傳遞owner的參數(類型一定要與File's Owner的class 一致)
如果還有不清除的可以留言,評論, 如果我有空會盡量給大家解答的!
如果需要源代碼,可在如下百度雲鏈接下載:
鏈接: http://pan.baidu.com/s/1sj3LwxJ 密碼: 9g6w
好了,大概也就這些了,謝謝你們的閱讀! 你們的評論是對我最大的鼓勵! 謝謝