Подтвердить что ты не робот

Проблемы с UITableView с cellForRowAtIndexPath

Я пытаюсь заполнить 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:'

Массив в этом индексе регистрирует как законную строку, но не возвращает ячейку должным образом. Таким образом, он не загружается мимо этого момента. Пожалуйста, помогите.

4b9b3361

Ответ 1

Мне кажется, что у вас есть частично видимый случай переключения, когда он возвращает ячейку для случая 1. Ваша ошибка заставляет меня думать, что вы возвращаете нулевую ветвь UITableViewCell в вашем случае коммутатора.

Убедитесь, что все пути из этого случая коммутатора возвращают действительный объект UITableViewCell.

Что вы возвращаете для случая 0? Другими словами, что вы возвращаете для первой строки, которую запрашивает UITableView?

Вот пример кода из одного из моих проектов, он может дать вам хорошую отправную точку, чтобы увидеть, где вы ошибетесь:

- (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;
}

Ответ 2

Не уверен, почему у вас есть "случай 1:" сидит там один, но если это случай, отличный от 1, это провалится, и все, что приходит после этого, будет возвращено. Убедитесь, что вы ВСЕГДА возвращаете ячейку.

Ответ 3

Вероятно, вы не возвращаете ячейку для indexPath.row == 0 (ваш "случай 1" является подозрительным...). Но не могу сказать, если вы не публикуете все свои инструкции switch.

Попробуйте вернуть "ячейку" вне вашего оператора switch, вы поймете, что произойдет. У вас не будет ошибки утверждения.

Ответ 4

Проверьте, что вы получили

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

в

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

Ответ 5

Хорошо, если все другие решения по этому вопросу не работают, убедитесь, что Cell Identifier для ячейки представления таблицы (в раскадровке) соответствует идентификатору ячейки, который вы используете в коде tableviewdelegate:

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

Идентификатор ячейки в вашем раскадровке должен быть "CustomCell" для соответствия этому коду.

Ответ 6

В моем случае я имел ту же ошибку, потому что мне не хватало alloc/init:

if (cell == nil) {
        cell = [[UITableViewCell alloc] init];

}