cellForRowAtIndexPath: возвращает ноль для универсальной ячейки прототипа - PullRequest
8 голосов
/ 02 января 2012

Это сводит меня с ума!

У меня есть универсальный класс UITableViewController с универсальной ячейкой прототипа с идентификатором «myCell». Разрабатывая под ARC, iOS5 и используя раскадровку, я использую следующий метод:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"myCell"];
    cell.textLabel.text = @"Title";
    return cell;
}

Все подключено в раскадровке, владельце файла и т. Д. У меня есть несколько других UITableViewController в моем проекте, использующих ту же концепцию. Все работают. Этот конкретный класс UITableViewController не хочет работать! продолжай бросать мне исключение:

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

Nslog'ed -> [tableView dequeueReusableCellWithIdentifier: @ "myCell"] = (null)

Любая идея и помощь с благодарностью!

EDIT:

Для простоты: - (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) раздел { возврат 1; }

То, что я уже сделал: 1. удалите, создайте и настройте UITableViewController в раскадровке! 2. Перезапущенный Xcode 3. Перезапущенный симулятор 4. Перезагрузил компьютер !!!! 5. Удаление и сборка приложения снова и снова! Никто не работал.

Кстати, я пробовал

if (cell == nil)
 cell = [UITableViewCell alloc] initWithStyle....

.. и это решит проблему, но опять же ... это ARC, раскадровка, ... я не должен этого делать. Xcode должен позаботиться об этом!

Ответы [ 4 ]

2 голосов
/ 05 января 2012

В конце концов я нашел ошибку. Я не могу сказать, что нашел основную причину, но исследуя построчно, это то, что я нашел и работал для меня.

В моем UITableViewController есть несколько объектов, которые должны быть выделены / инициализированы перед загрузкой представления, чтобы когда вызывающие абоненты могли установить их для предопределенных значений. Поскольку viewDidLoad слишком поздно, я поместил их в метод initWithCoder.

Вывод и переписывание метода initwithCoder решило проблему. Мне показалось, что initWithCoder метод инициирует UITableViewController как нечто иное!

2 голосов
/ 02 января 2012

Вы должны создать свою ячейку:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"myCell"];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"myCell"] autorelease];
    }

    cell.textLabel.text = @"Title";
    return cell;
}
0 голосов
/ 09 октября 2013

если выражение «IF» становится равным true (ячейка == ноль) для следующего:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"myCell"];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"myCell"] autorelease];
    }
    cell.textLabel.text = @"Title";
    return cell;
}

, тогда имя @"myCell" было либо написано с ошибкой (не соответствует), либо отсутствуетиз поля идентификатора раскадровки для ячейки.

0 голосов
/ 04 января 2012

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

  1. Выберите представление таблицы.
  2. Затем перейдите к инспектору объектов на третью вкладку справа.
  3. Первый вариант называется: «Содержимое».Измените выбор с «Статические ячейки» на «Динамические прототипы».
  4. Убедитесь, что вы правильно установили идентификатор ячейки и то же имя, которое используете в «dequeueResableCellWithIdentifier»

Это сработало для меня.Я перестал получать значения «ноль», и все, кажется, работает правильно.

...