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への強参照を持つと循環参照になってしまうのでそこは注意。