IBOutletでView以外のオブジェクトを扱う
最近分ったがIBOutletはGUI部品であるViewを扱うだけでなく、通常のオブジェクトを扱うこともできる。
例えば、テンプレートからViewControllerクラスをxibファイルと共に作成したとしよう。そのxib中の通常のオブジェクトをアーカイブする。
画面を構成するためにxibファイルを開き、ViewやそのサブViewをライブラリィパレットからポトペタするのは通常通りだが、同じライブラリィパレットの中にはObjectが用意されており
これをキャンバス(グリッドの描かれているエリア)へ落とすと、左側のガターの部分にObjectのアイコンが現れる。
これでxibファイル中にオブジェクトを仕込むことができたので、次はIBOutletでコードに接続すれば良い。このまま接続するとObject(NSObject)型のフィールドになるが、それが嫌であれば自分の好きな型をインスペクタで指定することもできる。
ここではiOSプログラミング 第2版で使用しているPossessionクラスを指定しているが、カスタム型を指定した場合、Objets上のアイコンもその型名に変わる。
型が決まったならば、実際にコードに接続してみる。xibファイルをインタフェースビルダで開いた状態で、アシスタントエディタ()を開くと、File's Owner、つまりViewControllerクラスのヘッダファイルが開くのでその状態でPossessionオブジェクトを選択、CTRL+ドラッグでコード上にドロップする。
ドロップすると、IBOutletの種類とフィールド名を聞いてくるので、適宜入力する。また、ここで別な型を指定することも可能だ。
型とフィールド名の指定が完了すると、このようにプロパティの宣言コードが生成される。
これでViewControllerクラスとpossionフィールドがIBOutletで接続された訳だ。
このとき実装ファイル(.m)側には、同時に@synthesizeの記述がされており
これ以降possessionはViewControllerからアクセスできるプロパティとして扱うことができる。便利だ。
更にはViewControllerのアンロード時(viewDidUnload)と破棄時(dealloc)時にはそれぞれフィールドをnilクリア、releaseするコードも自動的に追加される。
ViewControllerの全てのフィールドをIBOutletで接続する必要は無いが(無駄)、例えばViewControllerが管理するViewと関連が強いModelや必ず使うViewModelとして使用するクラスに関してはIBOutletでインスタンス化しておいても損は無いだろう。
追記:
ViewControllerの遷移時にPossessionオブジェクトのプロパティを外部から書き換える場合は注意が必要だ。ViewControllerが生成した後にxibにアーカイブされたオブジェクトがアンアーカイブされるが、その前にいくらプロパティを書き換えても意味が無いからである。