Outlet 與 Action

我們會在 Xcode 寫程式和 Interface Builder 製作畫面,按照 Cocoa Touch 開發概念 Model-View-Controller 的切割我們的 GUI-based application。但是要如何將彼此連接起來呢?因為我們也是要寫 code 去處理這些 Interface Builder 建立出來的 elements。

我們的 Controller class 是可以參考到 nib 裡面,使用特定的 instance variable 叫做 outlet。把他想像是一個指標指向 nib 裡面的 object。舉個例子,今天在 Interface Builder 建立了 text label,希望這 label 上面的 text 可以從程式裡面改變。透過宣告 outlet 然後將它們彼此連起來,就可以從程式碼裡面調整值了。

Outlet 是用 IBOutlet 關鍵字來宣告成 instance variable,所以宣告完會像這樣:

@property(nonatomic, retain) IBOutlet UISlider *redSlider;

任何 instance variable 想要連到 nib file 都要用這樣關鍵字。當打開 Interface Builder,它會掃描 Project 裡面檔案開頭有這樣關鍵字,讓我們開發人員可以從程式連接到 nib。

在 nib 檔案裡面的 Interface Object 可以設定來驅動到我們 controller class 特定的 methods。而這是用 action methods。舉例,今天可以告訴 Interface Builder 當使用者按下螢幕離開後,呼叫程式裡面特定的 method。

Actions 是 controller class 裡面部份的 methods。他們是用特定關鍵字 IBAction,讓 Interface Builder 可以驅動將 action 帶到 control。一般來說會宣告類似這樣:

- (IBAction)updateColor:(id)sender;

Method 名稱可以自己定義,但是一定要回傳 IBAction,跟回傳 void 很像。這是另外一種 action methods 不回傳值的方式。一般來說,Action 會接受參數,定義 id 然後加上 sender。Control 會驅動我們的 action 而使用 sender 參數傳遞。所以如果 action method 是呼叫按鈕按下,就會讓它去對應到特並按鈕被按下。

不論在 method 要宣告 sender 或者不宣告都不會影響。因為可能我們在看些範例時候,會看到不一樣寫法,這是因為有歷史的,過去 Cocoa 不管有沒有使用到都是要規劃 sender。

最近寫了一些範例練習題,開始接處到這邊,原本 action, outlet 一直不是很懂,經過閱讀 Beginning iPhone 3 Development 的 Handing Basic Interaction 就更了解了。

Comments