ViewController
ViewController とは?
アプリケーションの内部構造の基盤であり、すべてのアプリケーションは少なくとも1つの ViewController を持つ。UI 自体や、UI 同士の遷移の管理を行う。
ViewController には、以下の2つの種類がある。
Content view controller は、コンテンツを表示する通常のViewController
Container view controller は、他の ViewController (ChildViewController)から情報を集め、それらを描画する
クラス構造
UIScreen 物理画面を表す
UIWindow 画面に対する描画機能を提供する
UIView 描画を行う。ウインドウからの要求に応じて描画する
code:text
NSObject
┣ UIScreen
┗ UIResponder
┗ UIView
┣ UIWindow
┗ UIControl
責務
Apple のドキュメントで ViewController の責務として挙げられているのは、以下。
View Management
View hierarchy を保持, 管理する
Data Marchaling
View/Model 間でデータを仲介する
User Interactions
View 経由のイベントのハンドリングを行う
直接、というよりは、delegate や action method を介して
Resource Management
Adaptive
View の管理
ViewController は、単一の RootView とその SubView 群から構成される View Hierarchy を管理する。各 View は自身の SubView を 強参照 している。一方、ViewController が階層内の特定の View にアクセスしたい場合には、階層を辿っていくことはあまりなく、代わりに Outlet で参照を保持し、アクセスする。
Data Marchaling
ViewController は、Model と View の仲介役であり、その間でデータのやりとりを実現させるのが開発者の責務になる。ViewController がデータを保持しても良いが、source of truth は Model になるようになっているのが良いとのこと (それはそう)。
User Interactions
ViewController は Responder objects であり、Responder chain 経由でおりてきたイベントをハンドリングできる。とは言っても、ViewController がタッチイベントを直接ハンドリングすることは滅多にないはずで、大抵は delegate を介して View から受け取るか、action method 経由かになる。
Resource Management
UIViewController 自体は、view 管理の多くを自動的にハンドリングする。例えば、UIKit は利用されなくなった view 関連のオブジェクトは自動的にリリースする。
UIViewController のサブクラスを作成した場合、明示的に作成したオブジェクトの管理は、開発者の責務になる。メモリが不足してくると、UIKit はアプリケーションに不要なリソースをリリースできないか?聞いてくるが、これの1つが ViewController の didReceiveMemoryWarning を呼び出すことであり、このメソッドが呼び出されたときには、不要なオブジェクトや、後ほど再生成が容易なオブジェクトを削除する必要がある。例えば、データのキャッシュはここで削除するのが良い
Adaptivity
ViewController は、view の表現方法についての責務 を持ち、異なる環境下でも、適切に view を表現する必要がある。例えば、iOS アプリは iPhone/iPad の両方で動作する必要があるし、異なるサイズの iPhone で動作する必要もある。
iOS では、ViewController は以下をハンドルする必要がある。
coarse-grained changes
ViewController の trait (環境関連の設定値。ディスプレイサイズとか) の変更
重要な trait の内の2つは、現在の dimension における ViewController の垂直/水平サイズ
fine-grained changes
iPhone が開店したとき、サイズクラスは変わらないが、スクリーンの dimension は変更になる
Auto Layout を利用している場合は UIKit が自動でサイズや位置を調整してくれるが、ViewController で追加の調整もできる
さらなる詳細は Adaptive を参照。
The Role of View Controllers - View Controller Programming Guide for iOS
View Controller Hierarchy
大抵のアプリケーションは複数の ViewController をもち、ユーザはそれらの間を遷移する。このとき、遷移した ViewController 同士は双方が参照を保持する。UIKit は、この ViewController の参照関係が正しく行われていることが前提で動作するので、これに従っていないと予期しない動作を引き起こす恐れがある。
UIWindow
可視性のあるコンテンツは基本的には保持しない
rootviewController プロパティに、ユーザが最初に目にする ViewController を保持する
storyboard を利用していれば、このプロパティは UIKit によって自動的に設定される
利用していない場合は、開発者自身で設定する
Container view controller
UINavigationController, UISplitViewController, UIPageViewController 等が UIKit から提供されている
大抵は root view としてインストールされるが、モーダルとして表示したり、他のコンテナの子としてインストールすることもできる
child view controller は、親である container view controller やその兄弟となる別の child view controller について、最低限の情報だけ知ることができる
描画
ViewController の描画