2012-02-02 6 views
1

私は(別のカスタマイズ用)にUITableViewControllerという独自のバージョンを作成しようとしています。私のスーパークラスでは、デリゲートとデータソースの両方を実装し、UITableViewオブジェクトデリゲートとデータソースプロパティを "this"に設定しています。私は、必須のdataSourceとdelegateメソッドを実装していないと不平を言ってコンパイラの警告を受け取りました。私は私のカスタムUITableViewControllerをサブクラス化するときにこれらのメソッドを実装できるようにしたいと思います。カスタムUITableViewControllerクラスを実装し、デリゲートの警告を回避する

これらの警告を消すためのきれいな方法がありますか、または必須のデリゲートメソッドの空のバージョンを入れてサブクラスでオーバーライドする唯一の方法はありますか?これは悪い習慣ですか?誰でも、Appleがどのようにこれを達成するかについての洞察をUITableViewControllerクラスで持っていますか?

+0

「さらにカスタマイズする」とはどういう意味ですか?おそらく、あなたが "UITableViewController"の独自のバージョンを作るよりも良いことをする方法があるかもしれません。 –

+0

大きな事は、私のアプリケーションのすべてのviewcontrollerを設定するUIViewControllerクラスから継承したいということです。 –

+0

UIViewControllerでUITableViewを問題なく設定できます.UITableViewControllerは不要です。 –

答えて

3

Iは「抽象」方法は、このパターンを使用する:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    [self doesNotRecognizeSelector:_cmd]; 
    abort(); 
} 

_cmd変数は、現在の方法の選択です。 selfのように自動的に提供されます。

abort()は、abort()が返されないことをコンパイラが認識しているため、doesNotRecognizeSelector:についてはわからないため、abort()を呼び出す必要があります。

UITableViewControllerは、ストーリーボードからあらかじめ定義された(静的な)ローの読み込みをサポートしているため、少なくともiOS 5では、UITableViewControllerのメソッドは空ではありません。

+0

ありがとうございました。あなたの抽象的なパターンを実装するだけのことは好奇心だけど、その目的は何ですか?私はそれがユーザーが呼び出すことができるメソッドだった場合はそれ以上理解するだろうが、デリゲートメソッドはシステム/デリゲートによって呼び出されるだけです。あるいは、私が何かを逃しているかもしれない、あなたが説明できるなら、それを感謝するだろう。 –

+0

OK戻り値の警告を発しないように、なぜそれをしたのか分かります。メソッドに戻り値がない場合は、空白のままにしておくか、何か他のことをしたでしょうか? –

+0

'doesNotRecognizeSelector:'を返すのは可能ですが(まれですが)、私は常に 'abort()'を使います。 –

関連する問題