(註:環境Mac OS X Lion 10.7.3 + Xcode 4.2.1 + iOS SDK 5.0.)
比如工程中添加了一個UIViewController的sub class,建立的時候選中“With XIB for user interface”,則建立完成會同時產生三個檔案:xxx.h, xxx.m, xxx.xib(前期也可是*.nib,xib和nib都指UI源檔案,後來蘋果統一用xib尾碼名了)。
xxx.h預設內容:
#import <UIKit/UIKit.h>
@interface xxx : UIViewController
@end
xxx.m預設內容:
除了工程自動添加的介面,其它的任何內容都沒有。
*.xib預設有一個view,這個就是UIViewController的預設view,也是其它的任何子view都沒有添加. 此時從Xcode的Object Library中拖兩個控制項到該view:一個label,一個button.
最後如:
此後在xxx.h中也添加一個UILabel和一個UIButton,並且做為屬性。此時會發現Xcode自動在屬性的定義旁邊產生了兩個用於串連的小圓標誌,如:
可以看到上面對應的成員變數注釋掉了,其實在以前的老版本上面是必須要寫上的,表示對應的@property和@synthesize產生的屬性訪問器getter setter方法操作的是這兩個成員變數。後期的版本成員變數可以不用再這樣寫了。即:
(1)以前的版本:
標頭檔:
@interface xxx :UIViewController {
UILabel *label;
UIButton *button;
}
@property (nonatomic,retain)IBOutletUILabel *label;
@property (nonatomic,retain)IBOutletUIButton *button;
@end
*.m源檔案:
@implementation xxx
@synthesize label;
@synthesize button;
。。。
(2)Xcode 4.2的版本:
標頭檔:
@interface xxx : UIViewController {
// UILabel *label;
// UIButton *button;
}
@property (nonatomic,retain)IBOutlet UILabel *label;
@property (nonatomic,retain)IBOutlet UIButton *button;
@end
*.m源檔案:
@implementation xxx
@synthesize label = _label;
@synthesize button = _button;
。。。
後來的版本表示屬性存取方法預設操作的是_lable和_button成員變數。標頭檔中省寫了,當然*.m中也還是可以像以前那樣寫,不用在後面添加=_label和=_button也沒有任何問題,應該是編譯器預設作處理了。細節沒多追究。
現在原始碼中有label和button,對應的xib檔案中也有label和button,現在想把它們對應聯絡起來,畢竟很多時候一些動態效果是需要代碼來實現的。現在介紹方法:
方法:“拖拽”
如:
注意右上腳Editor位置,將視圖打到assistant editor,使顯示方式變成上面左邊是xxx.xib,右邊是xxx.h,此時點中右側label property聲明左側的小圓,按住並移向左側xib視圖地區的Label控制項上面。Xcode產生連線,此時鬆開即完成介面上label和代碼中label屬性的串連,button同理。連完後相應的小圓變成實心。滑鼠移到上面,會變成+號,並且左側xib介面上會顯示已經和介面上哪個控制項建立了串連。
如:
這就是所謂的拖拽方法,然後就可以在*.m檔案裡面隨意控制該控制項的顯示樣式了,包括背景顏色、背景映像,圓角,字型大小,所顯示的文本等等。
補充:
最近在網上偶然看到一位大牛的博文,對Xcode4中xib的綁定原理又有了新的理解,下面摘錄原文敘述如下:
1. 第一步:設定xib檔案的File's Owner的class屬性:
在xib檔案中有一個最重要的就是File's Owner,這個對象指的就是Class屬性中設定的那個類的對象。只有設定了Class屬性中的類才有辦法進行xib介面上的控制項與IBOutlet與IBAction的綁定關聯。也就是說要先檢查xib檔案中的File's Owner的屬性Class是否設定正確,然後再去設定對應的Outlet與Action。即設定了File's Owner對應的實體類之後Xcode就知道這個實體類有哪些IBOutet與IBAction,這樣在拖動進行串連的時候就會顯示實體類的標頭檔中定義好的IBOulet與IBAction。
2. 第二步:在上面指定的所屬類標頭檔中,聲明IBOutlet與IBAction:
在標頭檔中聲明IBOutlet與IBAction這兩個作用就是讓編譯器知道這些屬性與事件調用是公用給介面調用的。IBOutet就是把介面(xib)中的對象讀取到實作類別中,這樣就可以在實作類別中對這些介面控制項進行屬性的設定,從而改為介面的展示。
3. 第三步:在xib編輯器中(IB)進行關聯綁定(選中xib的File's Owner,Utilities視窗切換到connections inspector選項卡)
將connections inspector選項卡下的Outlets(如果在指定所屬類的標頭檔中聲明有IBOutlet),和Received Actions(如果有指定所屬類的標頭檔中聲明有IBAction)與中間視窗中的Objects下的控制項相拖拽串連。
具體即通過左鍵拖動關聯介面控制項與實作類別的IBOulet或IBAction即可完成介面編輯與綁定的操作。
放兩張圖:
Outlets:
Received Actions:
在此再次感謝這位大牛的部落格!
摘自 Code Heaven