Cocoa(iOS)はMVVC(Model-View-ViewController)パターンである。by me, 2011
ここで述べるターゲットはiOS5, Lion以降, ARC
- モデル依存の処理は記述しない e.g.) HTTPリクエストのコールバックなど
- ViewControllerが肥大化する場合は、ModelとViewにコードを移動できないか検討する
- ViewControllerのルールに沿って実装する(viewDidLoadが呼び出されたらxxをする)
- 基本的にCocoaはこのような受け身のモデル (layoutSubview然り, drawRect然り)
- Model
- Viewは持たない
- ViewControllerも持たない
- View
- Modelを持つ(=ViewControllerにも同じものを持たせる。Viewはシステムの都合で解放されることがあるため、ViewがModelを表示するためだけに持つ。)
- ViewControllerは持たない
- ViewController
- Viewを持つ (self.viewとそのSubview)
- Modelを持つ
シングルトンのオブジェクト、汎用的なControllerクラスはケースバイケース。
-viewDidLoad
は複数回呼び出されるのでそのViewControllerで使うView(self.viewとそのSubview)の初期化に関する処理のみを記述する- Viewはいつどのタイミングで解放されるか保証されないため
-viewDidUnload
で正しく処理する- 解放後再びロードされた時、
viewDidLoad
でModelの値が正しくセットされるようにする
- 解放後再びロードされた時、
- 編集可能なViewに対応するViewControllerは
UIViewController.editing
属性が使える - 別のViewControllerをモーダル表示させるときは
-presentViewController:animated:completion:
を使う
- weak属性のインスタンス変数で持つ
- ViewControllerを纏めるためのViewController
- UIKit標準ではUINavigationViewController, UITabViewController, UISplitViewController がある
- 子ViewControllerは、親ViewControllerで回転時に呼び出されるメソッド
-willRotate...
等が呼び出される - Viewの表示(
-addSubview:
)やframeのセットは自分で行う - コンテナViewControllerに子のViewControllerをaddやremoveする(した)時は
-will(did)MoveToParentViewController:
を呼び出す
- Identifierを忘れずに