IBOutletとIBAction その2

IBOutletはインスタンス変数又はプロパティとViewを接続(アウトレット)する仕組みだったが、IBActionはGUIを操作した際に実行する処理(メソッド)とViewとを接続する仕組みだ。

IBAction

IBActionのコードへの差込みはIBOutletと同様にクラスのヘッダファイル(.h)に行う

[ヘッダの宣言行にActionを差し込む]

IBOutletの時と同様にアシスタントエディタを開くとWindowのオーナ(File's Owner)であるヘッダファイル(Window-basedの場合はAppDelegate、View-basedの場合はViewControllerの派生クラス)が右側のペインに開くので、View上でCTRL+ドラッグすることで出る矢印をヘッダの@interface〜@endの中に接続した場合に"Action"を選択すると、

    • メソッド名入力
    • メソッドの引数の型を選択(id型)
    • Viewで可能な補足イベントの種類を選択
    • メソッドのパラメタ(無し、Senderのみ、SenderとEvent)を選択

これらを適宜指定することでIBAction型(実際にはvoid)を戻り値とするメソッドプロトタイプ行が自動的に生成されてViewと接続される。この例では"Touch Up Inside"、つまりタップされた事を表すイベントを選択している。

- (IBAction)showQuestionAction:(id) sender;

この時点でshowQuestionActionへの接続が初めてであれば実装ファイル(.m)※側にもメソッドのプレースホルダが出来ているはずだ。


[showQuestionActionのプレースホルダが実装ファイルに挿入されている]

以下のようなコードが追加されているだろう。

- (IBAction)showQuestionAction:(id) sender {
   //ここに何か処理を書く
}

これらの接続はコード側からView側に向けても行うことができるし、先日IBOutletの所で説明した通り、一旦Viewとの接続が解除されているコードを再度View側と接続することもできる。


なお、Viewの上で右クリックするとこのViewが送信可能なイベント(Sent Event)、アウトレット(Referencing Outlet)、アウトレットコレクション(Referencing Outlet Collections)の一覧を見ることができる。

それぞれには右端に端子のアイコンが表示されており、イベントならコード、アウトレットなら変数又はプロパティに接続していれはその情報が表示されるが、未接続の端子には今までに解説したのと同様にアウトレット又はアクションを接続することができる。(接続先に書かれている"×"アイコンをクリックすることで接続を解除することもできる)


["Touch Up Inside"イベントにはshowQestionActionメソッド、"btnQuestion"プロパティがアウトレット接続されている]

このようにIBOutletとIBActionの仕組みにより、ViewとViewControllerを接続してViewをのライフサイクルをコントロールするコードの記述を完全に省くことができる。

この仕組みはそれはそれでスマートだし便利なのだが、作業に慣れてきた場合には大量のViewをコードに一つずつ接続するのは面倒になるかもしれない。その場合になにか別な方法があるのか、それとも無いのかも調べてみようと思う。

特に、IBOutlet/IBActionと同じ操作を全てソースコードで記述することが出来るのであれば、いろいろとダイナミックなプログラムを作ることもできそうだ。


※拡張子".m"はヘッダに対してメッセージと呼ぶらしいが、分かり難いので敢えて"実装"と書いている。