16
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

InterfaceBuilderを使ってViewControllerを軽くする

Last updated at Posted at 2015-09-08

InterfaceBuilderを使ってViewControllerを軽くする

あまり記事を見かけないけど、実はInterfaceBuilderのIBOutletはNSObjectであればどのクラスでも接続することができる。
メリットとしては、

  • ViewControllerからロジックを分離できる
  • ロジック部分を複数のViewController間で共有できる

などなど。

方法

例として、

  • ボタンを押すと、ラベルのテキストを「Pushed」に変更する

という処理をやってみる。

  • 前提

    • UILabel, UIButtonをIB上で配置しておく
    • 実際に処理を行うLabelChangerクラスのファイルを追加しておく
  • 手順

    1. NSObjectFirst Responderの直下にドラッグ
    2. Custom Classでクラス名を指定←これが重要
      01-1.png
    3. クラス名を指定したあとはいつも通りIBOutletを接続して、ボタンが押されたときにラベルのテキストを変更する処理を書く
      02-2.png
    4. 起動してButtonをタップしてみる
    5. ラベルのテキストがPushedに変わる

これでViewControllerのコードを一切編集することなく、処理をモジュール化できる。
依存関係が無いように作っておけば、別プロジェクトにだって持っていける。

応用

ViewControllerと接続すれば画面遷移だって書ける。
Screen Shot 2015-09-08 at 11.25.33 PM.png

自分は、カスタムビューとそのカスタムビューを管理するマネージャクラスを作るときとかにこれをよく使う。

  1. マネージャはownerとしてViewControllerへ、viewとしてカスタムビューへIBOutletの接続しておく
  2. ViewControllerは取得したデータをマネージャに渡すだけ。ViewController自身はデータがどう使われるか知らなくていい
  3. マネージャはself.viewにデータをセットして表示する
  4. カスタムビューはタップされたらデリゲートとかでマネージャに通知
  5. マネージャはself.ownerを使って、画面遷移処理を行う

設計や仕様次第だが、viewをタップしたときの遷移処理をマネージャ内でブロックで定義して、データとともにviewに渡すのもあり。

ちなみに、このオブジェクトたちは、IBからViewControllerのインスタンスが読み込まれるときに生成されて、ViewControllerのインスタンスが破棄されるときに一緒に破棄される。ViewControllerへの強参照を持つと循環参照になってしまうのでそこは注意。

16
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?