4

UITableViewControllerメソッドで特定のセル プロパティを定義した がありますcellForRowAtIndexPath。私が実際に特定のものを定義した唯一のメソッドはcellForRowAtIndexPathメソッドでした。他の方法は含めませんでした。(基本的に UITableViewController は cellForRowAtIndexPath を除いて空です)

今、この UITableViewController に基づいてサブクラス化しようとしていますが、sublcass の cellForRowAtIndexPath をどのように設定すればよいですか? 空白のままにすると、セルが定義されていると想定されるため、アプリがクラッシュします。しかし、基本クラスで定義されたセルを使用するべきではありませんか?

基本クラスで作成したセル設定を使用するには、サブクラスの cellForRowAtIndexPath メソッドに正確に何を入れる必要がありますか?

編集私は解決策を教えられました、そして不思議に思っている人のために、あなたはあなたのサブクラス内でスーパーのクラスを次のように呼び出します

UITableViewCell *cell = (UITableViewCell *)[super tableView:tableView cellForRowAtIndexPath:indexPath];
return cell;

これにより、スーパーのセルがサブクラスに返され、そのセルが返されます。

4

4 に答える 4

1

このメソッドは、テーブルビューデータソースプロトコルの必須部分であり、指定する必要があります。UITableViewControllerの開発者向けドキュメントを見ると、cellForRowAtIndexPAthはその関数ではないことがわかります。ここにあるUITableViewDataSourceの下にあります。つまり、基本クラスには実装がありません。関数はプロトコルで抽象的であり、それらを拡張して実装することになっています。

空のテーブルを作成する場合は、代わりに空のセルを返すことができます。それらを割り当てて、関数に返すだけです。テーブルビューセルをサブクラス化する必要はありません。アプリのクラッシュが停止したら、必要なテキストを指定できます。indexPathを使用して、異なるセクションまたは異なる行のセルに異なるテキストを指定させます。

于 2013-01-31T19:26:43.377 に答える
1

私の理解が正しければUITableViewCell、 の実装で使用したいカスタムがありますtableview:cellFowRowAtIndexPath:。 このクラスのインスタンスを返すようにするに は、カスタム クラスと で定義された再利用識別子を使用し

て呼び出す必要があります。 例えば:registerClass:forCellReuseIdentifier:tableview:cellFowRowAtIndexPath:



- (void)viewDidLoad
{
   [super viewDidLoad];
   [self.tableView registerClass:[CustomTableViewCell class] forCellReuseIdentifier:@"CustomCell"];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"CustomCell";
    CustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    // Configure the cell...

    return cell;
}

電話することを忘れないでください#import "CustomTableViewCell.h"

于 2013-01-31T19:54:24.327 に答える
0

継承と委任を混同しています。UITableViewaにはクラスが必要であり、 であることに注意しUITableViewDelegateてくださいUITableViewDataSource。このクラスは から継承する必要はありませんUITableView。サブクラス化することで、あなたがやろうとしていることをよりよく理解できると思いますUITableViewCell

于 2013-01-31T19:18:23.887 に答える
0

cellForRowAtIndexPath を含む UITableViewController は、実際には既にUITableViewController のサブクラスであることがわかると思います。ヘッダーは次のようになります。

#import <UIKit/UIKit.h>

@interface MyTableViewController : UITableViewController

@end

UITableViewController を区別するのは

  • tableView への参照を保持する self.tableView プロパティがあります。
  • 通常の UIViewController スーパークラスにさらに 2 つのプロパティと 1 つのメソッドを追加しますが、さらに重要なことは...
  • それは(通常)tableViewのデリゲートおよびデータソースとして機能します

後者は、少なくとも 2 つのデータソース メソッドを実装する必要があることを意味します。デリゲート メソッドとして、これらはUITableViewController スーパークラスに実装されていないため、両方を含める必要があります。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
#warning Incomplete method implementation.
    // Return the number of rows in the section.
    return 0;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    // Configure the cell...

    return cell;
}

を実装cellForRowAtIndexPathしましたが、numberOfRowsInSection: も実装して、必要な大きさをテーブルが認識できるようにする必要があります。

于 2013-01-31T19:43:39.380 に答える