コントロールのイベントにメソッドを割り当てる : Objective-C プログラミング

PROGRAM


コントロールのイベントにメソッドを割り当てる

UITextField や UIButton などの UIControl から派生されたコントロールでは、何らかの操作を行った際に、それに対応するイベントが発生するようになっています。

例えば、UIButton が押された場合は "Touch Up Inside" というイベントが発生して、それにメソッドが関連付けられている場合には、UIButton が押されたタイミングで、そのメソッドが実行されます。

ここでは、インターフェイスビルダーを使用してイベントにメソッドを登録する方法と、Objective-C コードからイベントを登録する方法の 2 つについて見て行きたいと思います。

 

インターフェイスビルダーでイベントを割り当てる

このイベントをインターフェイスビルダーで割り当てる場合は、まず、割り当てたいメソッドを、そのコントロールが配置されているビューの UIViewController に定義します。

割り当てたいメソッドの戻り値のところを IBAction にして、引数は (id)sender を 1 つ採るようにします。

// インターフェイスビルダーで割り当てるメソッドは、戻り値を IBAction に、第一引数に (id)sender を設定します。

- (IBAction)pushButton:(id)sender;

引数の型は、もしこのメソッドを UIButton のイベントにしか割り当てないのであれば (UIButton*)sender でも大丈夫です。

 

割り当てるメソッドを定義したら、インターフェイスビルダーで、このメソッドを登録したいコントロールの上で右クリックします。

そして "Touch Up Inside" など、割り当てたいイベント名の右側の ○ をマウスでドラッグドロップして、線を、割り当てるメソッドを実装した UIViewController まで引っ張って行きます。

すると、IBAction として定義したメソッドの一覧が表示されるので、その中から目的のメソッドを選択します。

このようにすることで、上記の例では UIButton が押されたときに発生する "Touch Up Inside" イベントに、IBAction で定義したメソッド "pushButton:" が割り当てられました。

 

Objective-C でイベントを割り当てる場合

インターフェイスビルダーを使わずに、Objective-C コードでイベントを割り当てる場合は、UIControl に実装されている "addTarget:action:forControlEvents:" メソッドを使って割り当てます。

具体的には、コントロールが配置された UIViewController の初期化メソッドなどの適切な場所で、次のようなコードを記載する感じになります。

// UIButton 型の button に、"Touch up Inside" イベントを割り当てます。

[button addTarget:self action:@selector(pushButton:) forControlEvents:UIControlEventTouchUpInside];

このようにすることで、"Touch Up Inside" イベントに "pushButton:" メソッドが割り当てられました。

このとき、"pushButton:" メソッドの戻り値はわざわざ IBAction にしなくても、void にしても大丈夫です。どちらでも問題ないので、インターフェイスビルダーでも設定する可能性のあるメソッドであれば IBAction を付けておいて良いと思います。

 

ちなみに、コントロールに割り当てられたイベントのメソッドは、次のようにして意図的に呼び出すことが可能です。

// button に Touch Up Inside イベントを発生させます。

[button sendActionsForControlEvents:UIControlEventTouchUpInside];

このようにすることで、ユーザーが画面をタッチしなくても、button で "Touch Up Inside" イベントが発生したものとされて、それにメソッドが割り当てられていれば、それを実行してくれます。

[ もどる ]