IBOutletとIBAction (その1)

GUIを操作した結果を処理に結びつける方法はいろいろあるが、Xcode4においてはIBOutletとIBActionという魔法を使う。

IBOutlet


IBは"Interface Builder"の略だが、問題はアウトレットという言葉だ。今まで数ある開発環境を見てきたが、「アウトレット」という概念は初めてである。その言葉の意味からは(なにかとなにかを)繋ぐ、接続するという意味だということはイメージできるが、なにしろ馴染みが無い。

アウトレットの基本的な考え方は本家のここで学ぶ。
Cocoaアプリケーションチュートリアル: オブジェクト通信のパス:アウトレット、ターゲット、アクション

これによるとViewとそれを所持するクラスの変数又はプロパティとを結びつけるのに使用するのがIBOutlet(アウトレット)ということらしい。

アプリケーションのロード時に、アウトレットを表現するインスタンス変数が、対応するターゲットを指すように初期化されます。〜略〜 アウトレットが接続されていないと、対応するインスタンス変数の値はnullになります。

IBOutletはXcodeによりnibファイルが内包している(本当はそうではないのかもしれないがそのように見える)GUI Viewのインスタンスをクラスの変数又はプロパティに接続していることを表すものであるということだ。※

IBOutletの面白い所はその設定方法だ。"Assistant Editor"を開くとそのWindowの参照を保持しているAppDelgateクラス(View-basedの場合はViewControllerクラス)のヘッダファイルが開くので、View部品とヘッダファイル上の変数(プロパティ)との間を双方に結線し接続することができる。


[ViewであるButtonをAppDelgate.hの変数宣言部にアウトレットで結線する。]

Viewからの接続ではこのようにView(btnQuestion)上でCTRL+ドラッグ(又は右クリック+ドラッグ)で矢印が伸びるので、これをコード上に挿入する行か、既に記述されているプロパティに対して接続(アウトレット)することができる。


[行間に接続した場合、このように新規のIBOutletとしてダイアログが表示される]

接続が可能であるとXcodeが判断した場合はこのようにOutletを接続するのか後述するActionを接続するかを選択するダイアログが表示されるので、ここではOutletを選択して変数名(プロパティ名)を記述して「Connect」又はRETURNキーをを押下すると、プロパティ宣言のコードが自動生成され、

@property (strong, nonatomic) IBOutlet UIButton *btnQuestion;

以降、このクラスのインスタンスではbtnQuestion変数で結線したボタン(Button)を参照することができる。

既にあるプロパティ、変数の場合はその横に接続したことを示す◎が表示される。また、変数又はプロパティが未接続の場合は○のままだが(btnAnswerがそうだ)


[まだ未接続(○)のbtnAnswerプロパティにButtonをIBOutletで接続することもできる]

この状態でもXcodeはViewからコード、コードからViewのどちらからでも接続することができる。(効果は同じ)

Visual Studio等のIDEではView(コントロール)とコードとの接続には専用のエディタを用意したり、Viewそのものをダブルクリックなどすることで、Viewに対応する変数やデリゲートのプレースホルダとして使用するコードがその場で生成される。
Xcode4のIBOutletも変数(プロパティ)の記述とインスタンスの代入のコーディングを省くことが狙いなのは変わらないが、操作性がかなり違うため、ここが取っつきにくい印象を与えるのかもしれない。


※クラスのインスタンス変数にセットしているコードがどこかに生成されているはずなのだが、今の私には分らない。