Сбой пользовательской ячейки раскадровки iOS 5: UITableView dataSource должен возвращать ячейку

Это либо ошибка XCode, либо я пропустил здесь важное правило.

Обновление: - Какова вероятность того, что это странная ошибка в XCode/Storyboard?

Ситуация:

  • iOS 5, раскадровка
  • Это настройка раскадровки: https://i.imgur.com/T5WyD.png
  • Еще один скриншот полной настройки: https://i.imgur.com/1tVuz.png
  • TableViewController с пользовательской ячейкой, ячейка имеет многоразовый идентификатор «NewCell».
  • в "cellForRowAtIndexPath" у меня в основном есть:

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"NewCell"]; return cell;

  • Это вызывает исключение:

    Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'

Вещи, которые я уже пробовал:

  • Я настроил новый проект с нуля, TabBarController, с TableViewController и пользовательской ячейкой, все подключено к раскадровке, установил многоразовый идентификатор ячейки. Использовал тот же код, что и выше, работает отлично. Я не знаю, почему это не сработало с раскадровкой выше...

У меня есть ощущение, что это как-то связано с деревом, которое я там построил, которое представляет собой TabBarController, загрузку NavigationController, загрузку TableViewController, предоставление нескольких элементов, один из которых щелкнут, который загружает другой TableViewController, который не может работать с пользовательская ячейка, как-то.

Важно: проблема заключается в том, что раскадровка должна убедиться, что: UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"NewCell"]; никогда не вернет NIL (в отличие от раскадровки/iOS4). Но у меня ноль. И я не могу, черт возьми, понять, что происходит.


person James Stone    schedule 09.01.2012    source источник


Ответы (5)


Привет, у меня была эта проблема сегодня, и я выяснил несколько возможных причин. Чтобы связать UITableView в качестве подпредставления ViewController в раскадровке, убедитесь, что вы выполнили эти шаги.

  1. В вашем «ViewController.h» добавьте <UITableViewDataSource> в список протоколов.

    @интерфейс ViewController : UIViewController <UITableViewDataSource>

    вы могли бы также добавить <UITableViewDelegate>, но я этого не сделал.

  2. В вашем «ViewController.m» настройте функции источника данных таблицы.

    #pragma mark - Table view data source
    
    
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    {
        // Return the number of sections.
        return 1;
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        // Return the number of rows in the section.
        return [yourCells count];
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
    
        NewCell *cell = (NewCell *)[tableView 
                                               dequeueReusableCellWithIdentifier:@"NewCell"];
        if (cell == nil) {
            NSLog(@"Cell is NIL");
            cell = [[CustomCell alloc] 
                    initWithStyle:UITableViewCellStyleDefault 
                    reuseIdentifier:CellIdentifier];
        }
    
        return cell;
    
    }
  3. В раскадровке подключите ссылки UITableView «Источник данных» и «Делегировать» к ViewController.

  4. В раскадровке присвойте ячейке-прототипу идентификатор «NewCell».

Если это будет сделано, я считаю, что это должно работать.

Надеюсь, это поможет =)

person AnttyC    schedule 31.01.2012

Я всегда использую пользовательские ячейки в раскадровке следующим образом:

static NSString *CellIdentifier = @"Cell";

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

Убедитесь, что количество рядов/разделов равно как минимум одному. И еще одна вещь, которую нужно проверить, это то, что вы установили UITableViewController на свое собственное имя класса в раскадровке.

person Hubert Kunnemeyer    schedule 10.01.2012
comment
Это не то, как вы настраиваете ячейку с помощью Storyboard. - person Jordan; 10.01.2012
comment
да, это отличная новость о раскадровках, см. здесь: developer.apple.com/library/ios/#releasenotes/Miscellaneous/ — настройка представлений таблиц: он больше никогда не будет возвращать NIL... - person James Stone; 10.01.2012

  • Вы дважды проверили идентификатор прототипа ячейки «NewCell»?
  • Ваша настройка как Tabbar- > navigationcontroller- > tableview отлично работает. Я использую эту схему все время.
  • также убедитесь, что в этом
    контроллере представления/таблице/ячейке нет бесполезных атрибутов среды выполнения.
  • ваш прототип выглядит немного странно - вы добавили UIButton в ячейку как подвид? Зачем?
person mindbomb    schedule 10.01.2012
comment
а) проверено б) на самом деле это tabbar-›navcontroller-›tableviewcontroller-›tableviewcontroller-›tabview-›customcell c) нет d) добавлена ​​кнопка и случайные вещи, просто чтобы посмотреть, отображается ли что-нибудь... до этого были только метки - person James Stone; 10.01.2012

Чтобы решить эту проблему, добавьте следующее прямо над оператором dequeueReusableCellWithIdentifier:

static NSString *CellIdentifier = @"NewCell";

убедиться, что идентификатор соответствует ячейке прототипа в раскадровке

person Jordan    schedule 10.01.2012
comment
На самом деле я тоже пробовал это, но безуспешно. вот скриншот полной настройки: i.imgur.com/1tVuz.png - person James Stone; 10.01.2012

Возможно, уже поздно отвечать на этот вопрос, но держу пари, это решит все твои проблемы

person Shereef Marzouk    schedule 03.05.2012