986
技術社區[雲棲]
ios 開發file's owner以及outlet與連線的理解
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得到觸發控件的信息。
最後更新:2017-04-02 16:47:50