web-dev-qa-db-ja.com

cellForRowAtIndexPathに関するUITableViewの問題

私はuitableviewを複数のセクションで埋めようとしています。これは私のコードです:

static NSString *CellIdentifier = @"Cell"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}

case 1:
[[cell textLabel] setText:[usersTeachers objectAtIndex:(indexPath.row+1)]];
return cell;
break;

ビューを読み込もうとすると、このエラーが発生します。

2009-12-28 21:09:48.380 FSS[2046:207] *** Assertion failure in -[UITableView _createPreparedCellForGlobalRow:withIndexPath:], /SourceCache/UIKit/UIKit-984.38/UITableView.m:4709
2009-12-28 21:09:48.381 FSS[2046:207] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'

そのインデックスの配列は正当な文字列としてログに記録しますが、セルを適切に返しません。したがって、このポイントを超えてロードされません。助けてください。

18
Haydn Dufrene

ケース1のセルを返している部分的に見えるスイッチケースがあるようです。エラーにより、スイッチケースにnull UITableViewCellブランチが返されていると思われます。

そのスイッチケースからのすべてのパスが有効なUITableViewCellオブジェクトを返すことを確認してください。

ケース0では何を返しますか?つまり、UITableViewが要求する最初の行に対して何を返しますか?

これは私のプロジェクトの1つからのコードのサンプルです。これは、どこが間違っているかを確認するための良い出発点になるかもしれません。

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    NSInteger section = [indexPath section];

    switch (section) {
        case 0: // First cell in section 1
            cell.textLabel.text = [collectionHelpTitles objectAtIndex:[indexPath row]];
            break;
        case 1: // Second cell in section 1
            cell.textLabel.text = [noteHelpTitles objectAtIndex:[indexPath row]];
            break;
        case 2: // Third cell in section 1
            cell.textLabel.text = [checklistHelpTitles objectAtIndex:[indexPath row]];
            break;
        case 3: // Fourth cell in section 1
            cell.textLabel.text = [photoHelpTitles objectAtIndex:[indexPath row]];
            break;
        default:
            // Do something else here if a cell other than 1,2,3 or 4 is requested
            break;
    }
    return cell;
}
28
Brock Woolf

おそらくindexPath.row == 0のセルを返していません( 'ケース1'は疑わしいです...)。しかし、switchステートメント全体を投稿しない限り、言うことはできません。

Switchステートメントの外で「セル」を返してみてください。何が起こるかがよくわかります。その場合、アサーションエラーは発生しません。

2
Zoran Simic

あなたが持っていることを確認してください

if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
2
Maanas Royy

この質問に対する他の解決策がすべて機能しない場合は、テーブルビューのセル(ストーリーボード内)のセル識別子が、tableviewdelegateコードで使用するセル識別子と一致していることを確認してください。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath     *)indexPath
{
    static NSString *CellIdentifier = @"CustomCell";

このコードと一致するには、ストーリーボードのセル識別子が「CustomCell」である必要があります。

2
Scott Marchant

なぜ「ケース1:」が1人で座っているのかわからないが、1以外のケースの場合、これは失敗し、その後に何でも返される。必ずセルを返すようにしてください。

2
Ben Gottlieb