InterfaceBuilderを使ってViewControllerを軽くする
あまり記事を見かけないけど、実はInterfaceBuilderのIBOutletはNSObjectであればどのクラスでも接続することができる。
メリットとしては、
- ViewControllerからロジックを分離できる
- ロジック部分を複数のViewController間で共有できる
などなど。
方法
例として、
- ボタンを押すと、ラベルのテキストを「Pushed」に変更する
という処理をやってみる。
-
前提
- UILabel, UIButtonをIB上で配置しておく
- 実際に処理を行う
LabelChangerクラスのファイルを追加しておく
-
手順
これでViewControllerのコードを一切編集することなく、処理をモジュール化できる。
依存関係が無いように作っておけば、別プロジェクトにだって持っていける。
応用
ViewControllerと接続すれば画面遷移だって書ける。

自分は、カスタムビューとそのカスタムビューを管理するマネージャクラスを作るときとかにこれをよく使う。
- マネージャは
ownerとしてViewControllerへ、viewとしてカスタムビューへIBOutletの接続しておく - ViewControllerは取得したデータをマネージャに渡すだけ。ViewController自身はデータがどう使われるか知らなくていい
- マネージャは
self.viewにデータをセットして表示する - カスタムビューはタップされたらデリゲートとかでマネージャに通知
- マネージャは
self.ownerを使って、画面遷移処理を行う
設計や仕様次第だが、viewをタップしたときの遷移処理をマネージャ内でブロックで定義して、データとともにviewに渡すのもあり。
ちなみに、このオブジェクトたちは、IBからViewControllerのインスタンスが読み込まれるときに生成されて、ViewControllerのインスタンスが破棄されるときに一緒に破棄される。ViewControllerへの強参照を持つと循環参照になってしまうのでそこは注意。

