Skip to content

Instantly share code, notes, and snippets.

@novi
Created December 16, 2011 14:37
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save novi/1486278 to your computer and use it in GitHub Desktop.
Save novi/1486278 to your computer and use it in GitHub Desktop.
オレオレUIViewControllerコーディングガイドライン

オレオレUIViewController作成ガイドライン

Cocoa(iOS)はMVVC(Model-View-ViewController)パターンである。by me, 2011

オレオレCocoaコーディングガイドライン

オレオレUIViewコーディングガイドライン

ここで述べるターゲットはiOS5, Lion以降, ARC

最低限のルール

  • モデル依存の処理は記述しない e.g.) HTTPリクエストのコールバックなど
  • ViewControllerが肥大化する場合は、ModelとViewにコードを移動できないか検討する
  • ViewControllerのルールに沿って実装する(viewDidLoadが呼び出されたらxxをする)
  • 基本的にCocoaはこのような受け身のモデル (layoutSubview然り, drawRect然り)

MVVC、それぞれが持つべきもの持つべきでないもの

  • 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: を使う

Subviews

  • weak属性のインスタンス変数で持つ

コンテナViewController

  • ViewControllerを纏めるためのViewController
    • UIKit標準ではUINavigationViewController, UITabViewController, UISplitViewController がある
  • 子ViewControllerは、親ViewControllerで回転時に呼び出されるメソッド -willRotate... 等が呼び出される
  • Viewの表示(-addSubview:)やframeのセットは自分で行う
  • コンテナViewControllerに子のViewControllerをaddやremoveする(した)時は-will(did)MoveToParentViewController:を呼び出す

StoryBoard

  • Identifierを忘れずに
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment