UITableViewControllerはMVCで言うところのViewかControllerか?

iPhoneで代表的なUIの一つがリストメニュー。手で触って、高速にスクロールする様は使っていて楽しい。このリストメニューの実装を簡単にするのがCocoa Touchがアプリ開発者へ提供するUITableViewController。
Cocoa Touchでは、UIXxxViewをサポートする仕組みとして、UIXxxViewControllerというクラスが用意される。
ここで疑問が発生。UIXxxViewControllerはMVCで言うところのViewなのか、それともControllerなのか?名前だけ見ると、ViewのControllerのようにも見えるし、ViewとControllerの2つの機能を持つようにも見える。
UITableViewControllerを例にUIXxxViewControllerがVeiwなのか、Controllerなのかを調査してみた。

クラス図

まずはクラス図*1

UITableView

iPhoneのリストメニューを実現するクラスがUITableView。UITableViewはさまざまなバリエーションのリストメニューを実現する機能が搭載されている。
UITableViewはMVCで言うところのView。
UITableViewは小賢い。リストメニューに表示する内容はUITableViewを作ったオブジェクトが与えるのではなく、UITableViewがUITableViewDataSourceを通して、表示に必要なタイミング(つまり、UITableViewCellを生成するタイミング)を教えてくれる。開発者は、要求された番号の表示内容(UITableViewCellを継承したMyTableViewCell)をUITableViewへ与えてあげればよいだけとなる。

UITableViewDelegateとUITableViewDataSource

UITableViewには、さまざまなアプリのニーズに応えるべき柔軟性を高くする仕組みが搭載されている。柔軟性をあげる仕組が、UITableViewDelegateとUITableViewDataSource。
UITableViewは、UITableViewDelegateへリストメニューの振舞を委譲し、UITableViewDataSourceへリストメニューの表示内容の振舞を委譲する。
UITableViewDelegateとUITableViewDataSourceはMVCで言うところのController。

UITableViewController

本エントリの主役。UITableViewのControllerとしての雛形。アプリ開発者はUITableViewControllerを利用することにより、プログラミングの手間を省き、UITableViewを利用することができる。

  • UITableViewの生成をしてくれる
  • UITableViewとUITableViewControllerの関係を作ってくれる
  • UITableViewの委譲に対するインターフェース(UITableViewDelegateとUITableViewDataSource)をデフォルトで実装してくれる

アプリ開発者はUITableViewを継承する独自クラス(MyTableView)を作成し、振舞をカスタマイズしたいメソッドをオーバーライドすれば、独自のアプリを作ることができる。

UITableViewControllerはMVCで言うところのViewかControllerか?

結論から言うと、UITableViewControllerはMVCで言うところのController。ちょっと深読みしすぎたか・・・
深読みしすぎた理由は、ViewとControllerはアプリが関係付けるべきと勝手に思い込んでいたため。そのため、UITableViewControllerを作ると、UITableViewが生成されてしまうところに違和感があった。
よく考えると、独自のViewを新規に作る場合、OutletはUIViewController側に実装し、Interface Builderで関係付けを行う。そういうルールになっているから、そうしていただけなのだが、そうさせるようにされていたというのが正しいところのようだ。
アプリ開発者に何も考えさせず、こう実装して欲しいと思う方向に持っていくCocoa Touchは、フレームワークの理想系が具現化されていると言える。

感想

Cocoa Touchでアプリを開発している人はこんな疑問を持ったりするのだろうか?私が気にしすぎ?

*1:個人的にprotocolはinterfaceとして考える方が考えやすかったので、protocolはinterfaceとして記載