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獲得觸發控件的信息。