2012-01-02 3 views
8

Это сводит меня с ума!cellForRowAtIndexPath: возвращает ноль для базовой прототипной ячейки

У меня есть общий класс UITableViewController с общей ячейкой прототипа с идентификатором «myCell». Разработка под АРК, 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"] = (нуль)

Любая идея и помощь очень ценится!

РЕДАКТИРОВАТЬ:

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

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

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

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

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

+0

У меня такая же проблема. Не могли бы вы рассказать, как вы решили этот вопрос? Я должен пропустить что-то в конфигурации раскадровки. – bashan

+0

еще не поняли. Если я найду ответ, я отправлю его здесь. – Canopus

+0

Похоже, что нам что-то не хватает в раскадровке. Вероятно, у него есть по умолчанию поведение, которое нам нужно изменить. Интересно, как много других людей имеют ту же проблему ... – bashan

ответ

2

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

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

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

2

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

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

это под ARC, нет необходимости выделять/init/autorelease. раскадровка должна делать это, как это делают во всех других экземплярах UITableViewController. – Canopus

0

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

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

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

+0

Я проверил это уже. Это не так. – Canopus

0

если «IF» утверждение падает истинной (ячейки == ноль) для следующих целей:

- (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" было или неправильно (не совпадает) или отсутствует раскадровке поле идентификатора для ячейки.

Смежные вопросы