3

私は を持ってUITableViewおり、カスタム が含まれていますUITableViewCell。テストするために、3 つの文字列を含む配列があります。UITableViewデリゲート メソッドは期待どおりに呼び出されますが、tableView :cellForRowAtIndexPathデリゲートには常にNSIndexPath、row プロパティが always であるインスタンスが渡され== nilます。

tableView:cellForRowAtIndexPath3回呼び出されます(配列内のオブジェクトごとに1回)。tableViewデザイナー (絵コンテ) 内に fromを追加し、そのアウトレットを作成しました。UITableViewCell インスタンスは、このデリゲートを呼び出すたびに正しくインスタンス化されているように見えます。[indexPath row]値が常に である理由に頭を悩ませることはできませんnil

インターフェース:

実装ファイル内:

@interface FirstViewController ()
@property(nonatomic, strong)AppDelegate *sharedDelegate;
@property(nonatomic, strong)NSArray *userList;
@end

ヘッダー内:

@interface FirstViewController : UITableViewController <FacebookDelegate>
@property (strong, nonatomic) IBOutlet UITableView *tableView;
@end

カスタム セルを初期化します。

-(void)viewDidLoad
{
    [self.tableView registerClass: [ListCategoryCell class]forCellReuseIdentifier:@"ListCategoryCell"];
    self.userList = @[@"d", @"g", @"f"]; // make some test data
}

そして、これは私を怒らせている代表:

//NSIndexPath.row is nil ?!
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    static NSString *MyIdentifier = @"ListCategoryCell";
    ListCategoryCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier forIndexPath:indexPath];
    if (cell == nil) {
        cell = (ListCategoryCell *)[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault  reuseIdentifier:MyIdentifier];
    }
    cell.titleLabel.text = [self.userList objectAtIndex:[indexPath row]];
    cell.detailLabel.text = @"Detail";

    return cell;
}

何か不足していますか?ありがとう!

現在作業中

私の問題に非常に関連していると思われるいくつかのコンテキストを省略しました(そして、持つべきではありません)。最初に UIViewController を作成し、これに UITableView をビューとして追加しました。UITableView でカスタム プロトタイプ セルを作成しました。私はすべての家事をしました:

UIViewControllerUITableViewDelegate&を実装しましたUITableViewDatasource。のアウトレットを作成しましたUITableView。すべてのコンセントを接続しました

プロパティindextPath.rowが常にnil. 私が見つけたいくつかのリソースは、uitableview デリゲートが呼び出される前にカスタム セルが表示されないことを示唆していました。

最後に、クラスを のサブクラスにしUITableViewControllerました。物事はうまくいき始めました。なぜ私の最初の試みが失敗したのか、私はまだ興味があります。

みんなの時間をありがとう。いくつかのすばらしいコメントは、「知っておくとよい」いくつかのトピックを調査するのに役立ちました。

4

1 に答える 1

1

テーブル ビューを管理する場合は、View Controller で少なくとも 2 つのメソッドを提供する必要があります。彼らです:

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

2 番目のメソッドは既に提供されているため、テーブル ビューは実際にセルを生成できますが、セルの数はわかりません。最初のメソッドが返すデフォルト値は nil です。これが、インデックス パスさえ持っていない理由です。

オプション:

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

デフォルト値は 1 であるため、セクションが 1 つしかない場合はこれをオーバーライドする必要はありません

ビュー コントローラーもデリゲートおよびデータソース プロトコルに従っていることを確認してください。

于 2014-08-01T10:55:29.910 に答える