UITableView dataSource должен возвращать ячейку из tableView: cellForRowAtIndexPath: Exception - PullRequest
43 голосов
/ 08 февраля 2010

я на самом деле не вижу свою ошибку:

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

  FriendTableViewCell *cell = (FriendTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  if (cell == nil) {
      cell = [[[FriendTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
      [[NSBundle mainBundle] loadNibNamed:@"FriendTableViewCell" owner:self options:nil];
      cell = friendCell;
  }
  cell.lblNickname.text =  @"Tester";
  return cell;
}

Что я делаю не так? Я проверил все дважды .. но не вижу ошибки.

Спасибо за вашу помощь!

Ответы [ 9 ]

66 голосов
/ 09 февраля 2010

Вы возвращаете friendCell, и, скорее всего, ноль.

Ваш код выглядит нормально, поэтому убедитесь, что у вас правильно настроен файл Interface Builder. В FriendTableViewCell.xib убедитесь, что Владелец файла является вашим контроллером табличного представления, и что вы правильно установили ячейку в качестве выхода для FriendCell (который я предполагаю, что это UITableViewCell).

33 голосов
/ 08 сентября 2012

Для меня это сработало:

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

UPDATE
Поместите приведенный выше код следующим способом:

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

Просто поместите его ДО редактирования таблицы ViewCell

2 голосов
/ 19 апреля 2012

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

2 голосов
/ 08 февраля 2010

Вы создаете FriendTableViewCell, а затем игнорируете его и устанавливаете его равным (предположительно) переменной экземпляра с именем friendCell.

Я предполагаю, что вы ожидаете, что friendCell будет установлен при вызове метода loadNibNamed. Это, видимо, не устанавливается.

Итак, у вас есть две проблемы с этим кодом. Во-первых, не выделяйте ячейку дважды.

cell = [[[FriendTableViewCell ....
[[NSBundle mainBundle .....
cell = friendCell;

Очевидно, что создание новой ячейки и назначение ее ячейке бесполезно, если вы перезаписываете ее вторым вызовом присвоения ячейке.

Во-вторых, friendCell, вероятно, равен нулю. Убедитесь, что NIB настроен правильно и имеет розетки, указывающие на правильные места.

1 голос
/ 12 июня 2014

Я обнаружил, что эта проблема возникла при попытке создать мой UITableViewCell перед инициализацией моего табличного представления:

Здесь регистрация класса перед созданием tableView вызовет ошибку, а размещение его после исправит ошибку.

[tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:bCellIdentifier]; 

tableView = [[UITableView alloc] initWithFrame:CGRectZero];
tableView.delegate = self;
tableView.dataSource = self;

[self addSubview:tableView];

tableView.keepInsets.equal = KeepRequired(0);
0 голосов
/ 05 сентября 2013

Убедитесь, что ваш идентификатор повторного использования в файле NIB / Storyboard для ячейки прототипа соответствует тому, что вы называли CellIdentifier

 static NSString *CellIdentifier = @"Cell";
0 голосов
/ 08 июня 2013

Используйте это,

UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:kCellID];

Я сэкономил еще несколько часов только с этими строками.

0 голосов
/ 11 января 2013

Не забудьте установить cell identifier в Интерфейсном Разработчике.

0 голосов
/ 12 февраля 2010

Смотрите здесь: Загрузка TableViewCell из NIB

Это документ Apple на эту тему.

//This is assuming you have tvCell in your .h file as a property and IBOutlet
//like so:
TableViewController.h
@property(nonatomic,retain) IBOutlet UITableViewCell *tvCell;
//Data Source Method...
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];

if (cell == nil) {

    [[NSBundle mainBundle] loadNibNamed:@"TVCell" owner:self options:nil];

    cell = tvCell;

    self.tvCell = nil;

используйте метод loadNibNamed: owner: options для загрузки ячейки в перо. Установите экземпляр ячейки для вашего объекта nib, затем установите для объекта nib значение nil.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...