2013-06-25 10 views
10

時々、私はいくつかのアプリケーションの幅広いカスタマイズのためにUIViewControllerをサブクラス化したいと思うことがあります。例えば。すべてのView ControllerがviewDidLoadまたはviewWillAppearの間に実行する必要があるものです。UIViewControllerとUITableViewControllerの違い

もちろん、私はUIViewControllerをサブクラス化してそこから移動し、すべてのView Controllerはそれを継承します。しかし、コントローラの中にはテーブルを実行するものもあります。そして、その目的のために設計されたUITableViewControllerがあります。

私もUITableViewControllerをサブクラス化して、同じことをやっています。これは、OOPの面で最もスマートなものではないようです。そして、そこ

何の多重継承などではないとのUITableViewControllerは今...のUIViewControllerから

を継承するとして、私はちょうど私の非常に自身のビューコントローラを継承する私自身のテーブルビューコントローラを作成していない理由を私は自分自身を求めていますサブクラス化し、すべてのテーブルのものを追加します。しかし、は "すべてのテーブルのもの"は何ですか?

  • xcodeが新しいテーブルビューコントローラごとに追加するスケルトンコードがあります。かなり便利ですが、簡単にコードスニペットに移動できます。
  • プロトコルUITableViewDelegateとUITableViewDataSourceの宣言があります。のんきな。これらのメソッドの実装は、とにかくUITableViewControllerの各サブクラスに従わなければなりません。
  • おそらく、プロトコルのすべての必須メソッドの適切なデフォルト実装があります。またはheightForRowAtIndexPathためtitleForHeaderInSectionまたは44.0fにnil:(。悪い例しかし、すべてのことを賢くを実装していないことでした)このようなnumberOfSectionsInTableViewに0を返すよう

それほど明白なものにもかかわらず、のUITableViewControllerが取るすべての奇跡がありますケア?

+0

回答いただいた皆様、ありがとうございます。これは、この特定のアーキテクチャの決定に多くの助けとなります。 –

答えて

10

私はよくクラスのドキュメントで定義されている行動UITableViewController追加のすべてを信じる:https://developer.apple.com/library/ios/#documentation/uikit/reference/UITableViewController_Class/Reference/Reference.html

のUITableViewControllerクラスは、テーブルビューを管理するコントローラオブジェクトを作成します。

•initWithNibName:bundle:メソッド(スーパークラスUIViewControllerで宣言されている)によってnibファイルが指定されている場合、UITableViewControllerはnibファイルにアーカイブされたテーブルビューをロードします。それ以外の場合は、正しいディメンションと自動サイズ変更マスクを持つ未構成のUI​​TableViewオブジェクトが作成されます。このビューには、tableViewプロパティからアクセスできます。

•テーブルビューを含むnibファイルがロードされると、データソースとデリゲートは、nibファイルに定義されているオブジェクト(存在する場合)になります。 nibファイルが指定されていない場合、またはnibファイルにデータソースまたはデリゲートが定義されていない場合、UITableViewControllerはデータソースとテーブルビューのデリゲートをselfに設定します。

•テーブルビューが初めてロードされるとき、テーブルビューコントローラはテーブルビューのデータをリロードします。また、テーブルビューが表示されるたびに、その選択(アニメーションの有無にかかわらず、要求に応じて)がクリアされます。 UITableViewControllerクラスは、スーパークラスメソッドviewWillAppear:でこれを実装します。この動作を無効にするには、clearsSelectionOnViewWillAppearプロパティの値を変更します。

•テーブルビューが表示されたら、コントローラはテーブルビューのスクロールインジケータを点滅させます。 UITableViewControllerクラスは、スーパークラスのメソッドviewDidAppear:でこれを実装します。

•スーパークラスメソッドsetEditing:animatedを実装しているため、ユーザーがナビゲーションバーの[編集|完了]ボタンをタップすると、コントローラはテーブルの編集モードを切り替えます。

これらはすべて、特定のコントローラとテーブルビューに適用すると再実装が容易な動作です。

一般的に私は、あなたが指摘したように代替継承階層を可能にするために、これらの動作を自分で実装することが望ましいことが分かった。通常、テーブルビューのdelagatedatasourceの両方を、 。それらは、通常、ビューコントローラを拡張するのではなく、他のクラス(例えば、特定のモデルクラスの専用データソース)によって処理されることができる独立した関心事である。

+0

ありがとうございます。やりがいのあるものだと思っています。あなたはUITableViewを区別することができる良いコードのexapleを知っていますか? –

+0

@Jonahどのように手動で最後の3つの箇条書きをUIViewController(つまり、テーブルビューが表示されたときにテーブルビューのスクロールインジケータをフラッシュし、スーパークラスメソッドsetEditingを実装する:テーブルの編集モード)?現在、私のセルはテーブルビューに戻ったときにハイライト表示され、スクロールバーは点滅せず、編集ボタンを押しても何もしません(ボタンのテキストも変更されません)。これらの方法やリンクの解説を編集してください。 – golddove

+0

@ golddove問題の理解を省略して解決策を提示することには消極的なので、ここでコード例が役立つかどうかはわかりません。点滅するスクロールインジケーターを実装する方法がわからない場合は、 'UITableView'のクラスドキュメントを見ることから始めましょう。これはすぐには解決できませんが、より一般的な' UIScrollView'のサブクラスです。 'UIScrollView'には' flashScrollIndicators'メソッドがあります。コントローラの 'viewDidAppear'内でそのメソッドを呼び出すと、' UITableViewController'に見られる動作が再現されます。 – Jonah

0

UITableViewControllerは、本当にあなたが望むのであれば自分のためにできる管理上の問題の多くを処理しているようです。 the documentationをチェックアウト - それは自動的にあなたのためにUITableViewを作成し、それをリロードなど

+0

"UITableViewは多くの管理上の問題を処理します" - あなたはUITableViewControllerを意味していると思いますか?また、著者は、あなたが書いている「はっきりとしたものの横にある」ということを指摘しています。 – Vive

3

をそれほど明白なものにもかかわらず、のUITableViewControllerはの世話を任意の奇跡があるのですか?

私は認識していません。私が知る限り、UITableViewControllerはほとんどの場合、数行のコードを追加する独自のサブクラスで置き換えることのできる便利なクラスです。

Apple's class documentationかなり多くのことがUITableViewController(と私はここでそれは将来的には変更される可能性がありますので繰り返すことはありません)。時々、クラスのヘッダーファイルから追加情報を集めることができますが、UITableViewController.hの場合は、ソースコードコメントはすでにクラスdocsにあるものを繰り返すだけです。

最後に、自分のサブクラスで複製するものを決定する必要があります。おそらくあなたのプロジェクトには.nibの処理が必要ないでしょうか?または、あなたのテーブルビューのどれも編集可能ではありませんか?だから、それをコード化しないでください...

関連する問題