UIViewとUIViewControllerの違いについて
iPhoneの開発を始めて最初に躓いたのは、UIViewとUIViewControllerだった。
ビューとは、ボタンなどのコントロールを配置したり、描画を行う表示領域のオブジェクト。この考え方は、VC(MFC)や.NET、VB6でも同様なので、簡単に想像できた。
しかし、UIViewとUIViewControllerはそもそも何が違うのか相当悩んだ。例えば、VC(MFC)では、CViewクラスというものがあり、イベント処理から描画処理まで全てをこなす。.NETのフォームクラスも、「コントローラ」的なものは必要ない。では、iPhoneSDKのUIViewって一体何するのもなんだ・・・?と。
結論から言うと、UIViewControllerは、1つ、または複数のViewを管理するクラス。画面のイベントを各ビューに振り分けたり、表示するビューを切り替えたりする役割。一方ビューは、各ビュー固有の描画処理を行ったり、表示構成(サブビューや親ビューの構成)を制御を行う。
まぁ、多くの処理はどっちのクラスに実装しても動作するし、切り分けも微妙なので、私は気分と雰囲気で適当に使い分けてます。

◆メッチャ悩みました① ~viewプロパティ~
で、分かるまで時間がかかったのが、UIViewControllerのviewプロパティ。複数のビューを管理できると書いてあるから、てっきりUIViewのリストでもメンバ変数に保持しているのかと思いきや、単一のプロパティしかない!
あれ?ビューとコントローラは必ず1対1?
じゃあコントローラの存在意義は?
なんて思った。実際は、同時にコントロールできるオブジェクトは1つだけ。画面遷移等で切り替えが必要になったら、viewプロパティの参照先を別のビューのインスタンスに切り替えて使うのが正解だったみたい。
最初の頃は、ビューの数だけコントローラを作成していたけど、10画面ぐらい作って気がついた。ちなみに、テーブルビューとテーブルビューコントローラ等、1対1で使用する前提のビューもあるみたいだから、別に間違いでもないのかな・・・。
◆メッチャ悩みました② ~UIViewの派生クラス~
で、もう1点悩んだのが、複数ビューを扱った時のビュー固有の表示処理。例えば、UIViewControllerの派生クラスのビュー表示時イベント(viewWillAppear)で初期表示処理を行う場合のお話。ビューが複数あると、if文で切り替えて描画処理を行うのだが、それをこの関数内に書くと当然グチャグチャのコードになる。
ビュー固有のクラスに描画処理を書きたいのに、ViewBaseApplication
ではそんものないし・・・。
なんて考えていた。これは、UIViewクラスの派生クラスを作っちゃえばいいんですね!始めからテンプレートに含めといて欲しかったんだけど。。
***** 2011/02/19追記 *****
最近は、1つのViewControllerに対して1つのView、という構成の方が
扱い易い気がして、ViewControllerをViewの数だけ作ることが多いです。
ただし、ヘルプ画面等、処理の少ないビューを複数切り替える場合は、
1つのViewControllerで制御したりしてます。(あくまで個人的な話です)
どちらが一般的な使い方なんでしょうね?
**************************
次回は、ViewBaseApplicationを自分なりに解析してみたので、これについて書こうと思ってます。かなり独学で学んでるので、間違ってたらどなたか指摘してやってください
***** 2011/02/19追記 *****
View Based Applicationを考える
**************************
ビューとは、ボタンなどのコントロールを配置したり、描画を行う表示領域のオブジェクト。この考え方は、VC(MFC)や.NET、VB6でも同様なので、簡単に想像できた。
しかし、UIViewとUIViewControllerはそもそも何が違うのか相当悩んだ。例えば、VC(MFC)では、CViewクラスというものがあり、イベント処理から描画処理まで全てをこなす。.NETのフォームクラスも、「コントローラ」的なものは必要ない。では、iPhoneSDKのUIViewって一体何するのもなんだ・・・?と。
結論から言うと、UIViewControllerは、1つ、または複数のViewを管理するクラス。画面のイベントを各ビューに振り分けたり、表示するビューを切り替えたりする役割。一方ビューは、各ビュー固有の描画処理を行ったり、表示構成(サブビューや親ビューの構成)を制御を行う。
まぁ、多くの処理はどっちのクラスに実装しても動作するし、切り分けも微妙なので、私は気分と雰囲気で適当に使い分けてます。
◆メッチャ悩みました① ~viewプロパティ~
で、分かるまで時間がかかったのが、UIViewControllerのviewプロパティ。複数のビューを管理できると書いてあるから、てっきりUIViewのリストでもメンバ変数に保持しているのかと思いきや、単一のプロパティしかない!
あれ?ビューとコントローラは必ず1対1?
じゃあコントローラの存在意義は?
なんて思った。実際は、同時にコントロールできるオブジェクトは1つだけ。画面遷移等で切り替えが必要になったら、viewプロパティの参照先を別のビューのインスタンスに切り替えて使うのが正解だったみたい。
最初の頃は、ビューの数だけコントローラを作成していたけど、10画面ぐらい作って気がついた。ちなみに、テーブルビューとテーブルビューコントローラ等、1対1で使用する前提のビューもあるみたいだから、別に間違いでもないのかな・・・。
◆メッチャ悩みました② ~UIViewの派生クラス~
で、もう1点悩んだのが、複数ビューを扱った時のビュー固有の表示処理。例えば、UIViewControllerの派生クラスのビュー表示時イベント(viewWillAppear)で初期表示処理を行う場合のお話。ビューが複数あると、if文で切り替えて描画処理を行うのだが、それをこの関数内に書くと当然グチャグチャのコードになる。
ビュー固有のクラスに描画処理を書きたいのに、ViewBaseApplication
ではそんものないし・・・。
なんて考えていた。これは、UIViewクラスの派生クラスを作っちゃえばいいんですね!始めからテンプレートに含めといて欲しかったんだけど。。
***** 2011/02/19追記 *****
最近は、1つのViewControllerに対して1つのView、という構成の方が
扱い易い気がして、ViewControllerをViewの数だけ作ることが多いです。
ただし、ヘルプ画面等、処理の少ないビューを複数切り替える場合は、
1つのViewControllerで制御したりしてます。(あくまで個人的な話です)
どちらが一般的な使い方なんでしょうね?
**************************
次回は、ViewBaseApplicationを自分なりに解析してみたので、これについて書こうと思ってます。かなり独学で学んでるので、間違ってたらどなたか指摘してやってください
***** 2011/02/19追記 *****
View Based Applicationを考える
**************************