ビューコントローラークラスについて話していると思います。私があなたのことを正しく理解していれば、あなたはそれを台無しにしようとしています。委任は、サブクラス化を回避する方法です。もちろん、デリゲートをサブクラス化することもできます - 問題ありません。ただし、ビュー内にテーブルを所有するスーパー クラスにテーブル ビューが必要です。また、ビューに別のテーブルとスーパークラスが所有するテーブルを持つサブクラスが必要です。
それは不可能ではありません。しかし、サブクラスの観点から見ると、サブクラスは 2 つのテーブル ビューを所有しています。それさえ可能です。ビュー コントローラーは、2 つのテーブルのデリゲートです (ビュー階層のどこで宣言およびインスタンス化されているかに関係なく)。デリゲート メソッドとデータ ソース メソッドをオーバーライドする場合、サブクラスは次のいずれかを行う必要があります。
- どのテーブルを扱っているか、どのテーブルから呼び出されているかを判断します。そして、両方のテーブルを適切に提供します。
- 処理している/呼び出されているテーブルを特定します。次に、「独自の」テーブルを適切に提供し、[super sameMehtod:withSamePamaters] を呼び出して、スーパークラスが引き続きデータとサーバーをデリゲートとして提供できるようにします。
両方のどちらがよりスマートかは、コンテキストと、詳細に何を達成しようとしているかによって異なります。
どのテーブルのデリゲートが呼び出されたかを判断するには、テーブル ビューにタグを付ける (タグとして 0 を使用しない) か、デリゲート メソッドの tableView パラメーターを対応するプロパティ (この場合は IBOutlets) と比較します。(それ以外の場合は、sender パラメーターを IBOutlets と比較できます。ただし、タグ付けは、後でコードを読むときに理解しやすいでしょう。)
UITableViewDataSourceDelegat の例を見てみましょう。
あなたのスーパークラスは以下を実装します:
@interface MySuperTableViewController:UITableViewController <UITableViewDelegate>
// There will be something in here.
// But it inherits self.tableView from UITableViewController anyway. We leave it with that.
@end
@implementation MySuperTableViewController
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// This method creates or re-uses a cell object and sets its properties accordingly.
}
@end
そしてあなたのサブクラス:
@interface MySubTableViewController : MySuperTableViewController // no need to declare the delegate here, it is inherited anyway
@property (weak, nonatomic) IBOutlet UITableView *mySecondTableView; // self.table will be used by the superclass already.
@end
@implementation MySubTableViewController
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
if (tableView == self.table) { // This call refers to the one talbe that is managed by super
return [super tableView:tableView cellForRowAtIndexPath:indexPath];
}
// This method now creates or re-uses a cell object and sets its properties accordingly.
// You may want to check wether tableView == self.mySecondTableView etc.
}
@end
(これはゼロから作成されたものであり、構文チェックなどは行われていません。これがすぐに適切に実行されるとは思わないでください :)
しかし...クラス構造を再検討してください。かなり非論理的なクラス階層で迷子になっているのではないかと心配しています。このサブクラス化がなくても、2 つの talbes を共通のビュー コントローラーで管理することに問題はありません。また、各テーブルに独自のデリゲート (ビュー コントローラーの場合もあります) があるビューで複数のテーブルを使用しても問題はありません。iOS 5 (または 6 で導入された) 以降、その目的で UIContainerView を使用し、IB/ストーリーボードでうまく構築できます。