xib檔案本身可以看做是一個xml,app啟動的時候會根據xml構造xib對應的界面及其控件,
file's owner 可以看做是 xib對應的類,比如 view對應的xib檔案的file'owner對應的就是 viewcontrol的類,
outlet是針對xib檔案中希望能夠在外部引用的控件成員,
那麼為什麼要做outlet與file's owner 之間的連線呢?
這裡file's owner 看做我們定義的類,即我們的代碼,裡面寫了哪些需要outlet的控件,
但是,具體它對應與界面上哪個控件呢,這個對應關系是沒有的,于是我們通過
file's owner 和 label之間的連線,确定了 我們代碼中的outlet控件與 xib中的控件的
對應。類似與 mfc中,我們定義了一個成員,這個成員與界面上的某個控件對應。
同樣的道理,我們雖然在 viewcontrol中 定義了 ibaction,即 事件響應的代碼,卻未将其與
實際的 ui的事件相關聯,于是我們通過連線,将事件與代碼中的響應處理對應起來。
outlet連線:control點選file's owner 拖拉到 相應控件 彈出菜單,選擇 outlet名稱
action連線:點選控件,在其事件清單中選擇要處理的,拖拉到file's owner。
對xib/nib, file's owner, first responder的了解
iphone開發廣義上來講,采用mvc模型,即model-view-controller。其中:
model為資料模型,比如使用者配置檔案;
view為顯示的界面元素,比如一個按鈕;
controller為控制器,是model和view之間進行溝通的橋梁。其中view和model之間不會直接通信,即model隻能與controller之間進行彼此通信,view隻能與controller之間進行通信。
在簡單的app中,可以沒有model,為了簡單起見,本文不設計model。
現在假設有兩個獨立的視圖cnview和enview,cnview和enview上分别有個button和label,對于cnview,一點選button,label則顯示“您好”,對于enview則顯示“hello”。下面基于這個例子來回到我們的重點。
1. xib檔案的了解
通過ib設計的cnview和enview分别對應一個xib檔案,在cnview的xib檔案中,主要采用xml格式描述了button和label控件的屬性(這裡不考慮view本身的背景等屬性),有個button和label,以及button和label的位置、大小等。enview的xib檔案類似。
2. viewcontroller
每個view對應有個視圖控制器(多個view可以采用同一個視圖控制器,後邊再說),可以看做mvc中的c(盡管嚴格意義上不是),比如:cnview界面點選按鈕之後的響應動作是由viewcontroller來實作的。
3. xib和viewcontroller之間的關系
xib是表現,viewcontroller一方面響應xib上的操作(比如點選、滑動等),同時也控制xib的顯示。
4. file's owner
重點就是這裡了,view和viewcontroller之間的對應關系,需要一個橋梁來進行連接配接的(即,對于一個視圖,他如何知道自己的界面的操作應該由誰來響應),這個橋梁就是file's owner。
選中某個xib的file's owner,在inspector中可以看到屬性:file name和custom class,該file's owner就是用來綁定file name中的xib檔案和custom class中的viewcontroller的,在做了這個綁定之後,按住control鍵,拖動file's owner到xib中的某個控件的時候,就是custom class中定義的iboutlet元素與xib中元素進行連接配接的過程,同樣,拖動"xib中的控件的動作"到file's owner的時候,就是将xib中該動作的響應與custom
class中某個ibaction進行連接配接的過程。
是以,在存在多個xib檔案的情況下,即:有多個view,那麼每個view可以采用不同的viewcontroller,也可以全部采用相同的一個viewcontroller,通過file's owner進行關聯即可。
其實,file's owner就是custom class類型的對象,而xib中的其他元素都是該對象的成員變量,但是需要手動來關聯custom class中的成員變量與xib中對象之間的關系。
5. first responder
view中每次隻會有一個對象與使用者進行互動,那麼目前互動的對象即為first responder。比如點選文本框,那麼此時文本框就是first responder。
在iphone開發中,輸出口和操作是比較重要的概念,在編輯iphone界面的時候,通過可視化工具,處理界面相關控件的布局,但并不能通過可視化工具實作對控件的修改和控件發出的操作,要完成這兩件事情就要分别通過輸出口和操作來實作。
輸出口
輸出口就是我們需要在代碼裡操作的控件。在nib檔案中,通過可視化操作來定義一個控件,如果這個控件需要在代碼中被修改,那麼就要定義一個輸出口指向這個控件,然後通過輸出口來修改這個控件,輸出口也就是一個指針指向了nib中的控件對象。輸出口使用關鍵字iboutlet聲明,類似下面一行代碼定義一個标簽輸出口:
@property (nonatomic, retain) iboutlet uilabel* mylabel;
我們希望定義一個标簽,在代碼裡需要更改這個标簽的内容,這樣就要象上面那樣通過關鍵字iboutlet聲明為輸出口,然後在interface builder中把這個輸出口和相應的标簽關聯,就可以在代碼裡通過這個輸出口操作标簽了。
操作
操作就是觸發一個控件後這個控件執行的方法。我們要添加一個按鈕,當你想在點選這個按鈕的時候改變螢幕的顔色,這時就需要定義一個操作改變螢幕顔色,然後在nib檔案中把操作跟這個按鈕關聯起來,當你點選這個按鈕的時候就會調用關聯的操作方法了。通常情況下操作方法的聲明如下:
- (ibaction)dosomething:(id)sender;
關鍵字ibaction告訴inerface buileder此方法是一個操作方法,可以被某個控件觸發。方法名dosomething可以為任意的你自己定義。傳回值必需是ibaction,其實它類似于void傳回值不傳回值。操作方法接受一個參數(id)sender,控件觸發了操作後就把自己傳給sender,這樣在操作方法裡就可以根據sender得到觸發控件的資訊。