1

私は1つのテーブルビューを持つ1つの親クラスを持っています。

そのクラスは、そのテーブルビューのデリゲートおよびデータソースでもあります。

今、そのクラスをサブクラス化 (派生) し、子クラスを作成しました。

子クラスにも1つのテーブルビューがあります。

次に、その子クラスでデリゲート関数とデータソース関数を定義しましたが、親クラスのテーブルビュー データ ソース/デリゲート メソッドをオーバーライドします。

でも二人とも別れてほしい。

ただし、私の要件は次のとおりです。

検索バーに含まれるすべてのviewControllersの上部にある検索バーとサイドボタン、その下にある最近の検索用語テーブルを保持したい。

そのため、その親クラスを定義し、そのクラスから他のviewControllerをサブクラス化することを考えました。

私はそれを正しい方法でやっていますか?

4

2 に答える 2

2

ビューコントローラークラスについて話していると思います。私があなたのことを正しく理解していれば、あなたはそれを台無しにしようとしています。委任は、サブクラス化を回避する方法です。もちろん、デリゲートをサブクラス化することもできます - 問題ありません。ただし、ビュー内にテーブルを所有するスーパー クラスにテーブル ビューが必要です。また、ビューに別のテーブルとスーパークラスが所有するテーブルを持つサブクラスが必要です。

それは不可能ではありません。しかし、サブクラスの観点から見ると、サブクラスは 2 つのテーブル ビューを所有しています。それさえ可能です。ビュー コントローラーは、2 つのテーブルのデリゲートです (ビュー階層のどこで宣言およびインスタンス化されているかに関係なく)。デリゲート メソッドとデータ ソース メソッドをオーバーライドする場合、サブクラスは次のいずれかを行う必要があります。

  1. どのテーブルを扱っているか、どのテーブルから呼び出されているかを判断します。そして、両方のテーブルを適切に提供します。
  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/ストーリーボードでうまく構築できます。

于 2013-02-28T13:05:52.473 に答える
0

これを試して、

ViewController.h

    IBOutlet UITableView *firstTable;
    IBOutlet UITableView *secondTable;

ViewController.m

  - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    // Return the number of sections.
   if (tableView == firstTable) {
       return 1;
    } 
   else if(tableView == secondTable)
   {
      return 1;
   }
return 0;
 }

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// Return the number of rows in the section.
if (tableView == firstTable) {
    return [arrItems count];
} else if(tableView == secondTable)
{
    return [arrData count];
}
 return 0;
}

などなど....

于 2013-02-28T13:01:27.937 に答える