2013-06-20 4 views
6

これは愚かな質問かもしれませんが、私はiOS開発中に何度もそれにぶつかりました。iOS - 子ViewControllerとUIViewサブクラスを作成するタイミングは?

複数の画面で使用するビューコンポーネントを開発することがありますので、UIViewのサブクラス化を行い、複数の場所で使用できるようにします。

次に、機能を追加します。おそらく、NSNotificationに応答する必要があるか、ユーザーの接触に応答する必要があります。

ある時点で、実際にUIViewControllerサブクラスを作成して、それを私のUIに子のViewControllerとして追加する必要があるのだろうかと思い始めます。

UIViewにいくつかの振る舞いを追加するときと、完全にUIViewControllerを作成するときとの間で線を引く場所についてコンセンサスがありますか?

答えて

3

データを処理または制御する必要がある場合は、いつでもコントローラを使用する必要があります。ビューはできるだけ愚かで、彼らが何を表示しているのか分からず、むしろどこにあるのか分からない。 ViewControllerを簡単にサブクラス化して再利用できます。良い例として、Popoverコントローラーとモーダルを使って、アプリケーション全体で文字列(またはテキスト)をユーザーから取得する必要があるとします。テキストフィールドとボタンが表示されたUIViewControllerの汎用サブクラスを作成します。このビューを使用すると、必要な容量のコントローラーを使用できます。ポップオーバー、モーダル、または他の場所でそれを再利用します(一般的に、データを委任を通じて戻します)。データを扱っているので、UIViewの唯一のサブクラスを使用してはいけません。

私の経験から、サブクラスUIViewControllersは、しばしばUIViewsです。一般的なアプリケーションのワークフローでコンテナやビューの再利用について話しているのかどうかはわかりません。いずれにせよ、それは同じでなければならない。

+0

美しいです。それはいつも私の傾向でもあります。 –

+0

これを投稿するように促したケースは、実際には再利用されないものでした。特定の画面に非常に特有です。しかし、コンポーネントには多くの配管があり、ViewControllerとの分離が必要なように感じました。 –

+0

ええ、私はあなたが何を意味するのか知っています。特定の状況のた​​めにUIViewControllerをサブクラス化することは悪い考えではありませんが、可能な限り一般的なものにしようとします。私の例のように 'ColorNameCollector'などの名前を付けないでください。色を取得するためにしか使用できないからです。むしろ 'StringCollector'のような名前にします。この方法では、より汎用的で、どこからどのように表示/使用されるかにかかわらず、ユーザーから文字列を取得する必要があるときはいつでも使用できます。 – Firo

0

私は、埋め込みビューコントローラを使用して、再利用可能なテーブルビューを時々ロードしています。私はそれが有用であることが分かったが、必ずしもそうではない。エンベデッドコントローラがコンテナに戻って通信するようにしたい場合のように、2つの間の通信は煩雑な場合があります。委任により、それはより簡単になりますが、まだ厄介です。また、iOS 5を正しく覚えていれば、iOS 6に制限されます。

追加するだけの場合は、カテゴリを使用していくつかの追加メソッドを保存することができます。 NSManagedObjectsでサブクラス化したくないということはたくさんあります。データモデルからNSManagedObjectを再生成すると、私のカテゴリでコードが失われることはありません。サブクラス化することなく、計算フィールドや変換メソッドなどの機能を追加できます。特定のインスタンスに対してこれらのメソッドが必要ない場合は、そのカテゴリへの参照を除外します。

IMOでもサブクラス化は決して悪くありません。

4

私は、コンセンサスをご紹介が、ここでは私の意見ですができません。

サブクラスUIViewだけ...

  • カスタムあなたは、いくつかをカスタマイズする必要があり
  • を描画したいと思います既存の動作UIViewサブクラス
  • サブビューをレイアウトするための特別なニーズがあります。ただし、ほとんどのレイアウトはUIViewControllerで行うことができます。たぶん、あなたが他のすべての例でジェスチャー認識機能

サブクラスUIViewControllerで行うことができない特別なタッチ処理のため

  • 。とにかく、ビューとモデルを結びつけるグルーコードを書くため、またはユーザーとのやりとりを処理するためには、ほとんどの場合常にコントローラーが必要です。結果的に、AppleはUIKitを使用してコントローラがすべての作業を行い、ビューを可能な限り「愚か」に保つことを容易にしました。たとえば、単一のビュー・サブクラスを持たなくても、複雑なビュー階層を作成するためにコントローラをネストするのは非常に簡単です。

    サブクラス化UIViewが最初に行うべきことではないインジケータは、UIView class referenceの「サブクラス化の代替」セクションです。 UIViewControllerをサブクラス化することが好ましいことを示す指標は、UIViewController class referenceにはこのようなセクションはありません:-)

  • +0

    すばらしい応答、ありがとう! –

    +0

    @herzbubeそういうわけで、IBの子VCを持つコンテナビューがあると思いますか?これは、シーン間でUIの部分を共有する方法です(プロフィール画像+名前+ステータスドットなど)? – allaire

    +0

    @allaireコメントは、議論にはあまり役に立ちません。あなたは、チャットチャンネルでこのディスカッションを開始して、意見を得ることができます。それが言われて、私は認めている1)私は多くのIBを使用したことはありません。 2)私は何ヶ月かiOS開発から切り離されているので、最近IBが開発者に与えていること、そしてAppleがどのように使用すべきだと思うかは分かりません。たぶんハイテクビデオか2つを見るのだろうか? – herzbube

    関連する問題