日々精進

新しく学んだことを書き留めていきます

ViewControllerを作る上で大事なこと

ViewControllerを作る上で大事だと思うことを挙げてみる
・ViewControllerはツリー構造にする。ツリー構造は画面上の領域の親子関係と一致させる。
言い換えると子のコントローラのViewは必ず親のコントローラのSubViewになっている。
各ViewControllerは画面上のどの領域の制御を担当するかが決まっていてそれ以外の領域を操作してはいけない。
子のコントローラの担当領域は親のコントローラの担当領域をはみ出してはいけない。
例えば、UISplitViewControllerのDetailViewはMasterViewのSubViewではない。よってMasterViewはDetailViewへの参照を持ってはいけない(持ちたくなる気持ちはわかるが。。)MasterViewからDetailViewにメッセージを送る場合はNotificationを使う。
・循環参照を作らない。
直接の子のコントローラ以外のコントローラにメッセージを送りたい時はNotificationを使う。
Delegateを使ってもいいかどうかは検討中。。Notificationに統一した方がいい気がする。
・子のコントローラのViewを極力制御しない。
例えば、以下はだめ。

self.childViewController = [[AViewController alloc] initWithNibName:@"AViewController" bundle:nil];
// viewの大きさは子コントローラ内で設定可能なのでここではやらない方がいい
CGRect frame = self.childViewController.view.frame;
frame.size.height = PORTRAIT_HEIGHT - STATUS_BAR_HEIGHT - NAVI_BAR_HEIGHT;
self.childViewController.view.frame = frame;

ただし、子のコントローラが持っている情報だけで処理できない場合は設定してよい。

self.childViewController = [[AViewController alloc] initWithNibName:@"AViewController" bundle:nil];
// このコントローラが持つ情報を使っているのでOK
CGRect frame = self.childViewController.view.frame;
frame.size.height = self.otherViewController.frame.size.height;
self.childViewController.view.frame = frame;

本当はchildViewControllerのframeを直接いじるのではなく、childViewControllerにsetHeightメソッドを定義してそれにheightの値を渡した方がいいんだろうけどそこまでやってない。。