Не удалось деактивировать ячейку с идентификатором Cell - должен зарегистрировать ниб или класс для идентификатора или подключить ячейку прототипа в раскадровке?
Я пытаюсь отобразить TableView списка песен в пользовательской библиотеке. Я использовал код из this tutoria l (который использует раскадровку, но я хотел бы попробовать по-другому и только с подклассом UITableView).
Я получаю сообщение об ошибке:
*** Assertion failure in -[UITableView dequeueReusableCellWithIdentifier:forIndexPath:], /SourceCache/UIKit/UIKit-2903.23/UITableView.m:5261
2014-05-07 20:28:55.722 Music App[9629:60b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'unable to dequeue a cell with identifier Cell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard'
и ошибка Thread 1: SIGABRT
в строке:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
Это мой код:
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
MPMediaQuery *songsQuery = [MPMediaQuery songsQuery];
NSArray *songs = [songsQuery items];
return [songs count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
// Configure the cell...
MPMediaQuery *songsQuery = [MPMediaQuery songsQuery];
NSArray *songs = [songsQuery items];
MPMediaItem *rowItem = [songs objectAtIndex:indexPath.row];
cell.textLabel.text = [rowItem valueForProperty:MPMediaItemPropertyTitle];
cell.detailTextLabel.text = [rowItem valueForProperty:MPMediaItemPropertyArtist];
cell.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Table-view-background.png"]];
cell.textLabel.textColor = [UIColor colorWithRed:0.278 green:0.278 blue:0.278 alpha:1.0];
cell.selectedBackgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Table-view-selected-background.png"]];
cell.textLabel.backgroundColor = [UIColor clearColor];
cell.detailTextLabel.backgroundColor = [UIColor clearColor];
return cell;
}
Приложение загружается и работает отлично, показывая пустую таблицу, когда я запускаю ее в симуляторе iPhone на своем Mac. он приходит с этой ошибкой, когда я запускаю ее на своем iPhone.
Любая помощь будет очень признательна, спасибо!
Ответы
Ответ 1
Если вы создаете табличное представление программно, и вы используете только UITableViewCell по умолчанию, то вам следует зарегистрировать класс (в viewDidLoad - хорошее место). Вы также можете сделать это для пользовательского класса, но только если вы создадите ячейку (и ее подпрограммы) в коде (используйте registerNib: forCellWithReuseIdentifier: если ячейка сделана в файле xib).
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
Тем не менее, это даст вам только базовую ячейку таблицы, в которой нет detailTextLabel. Чтобы получить этот тип ячейки, вы должны использовать более короткий метод dequeue, dequeueReusableCellWithIdentifier:, который не генерирует исключение, если он не находит ячейку с этим идентификатором, а затем имеет предложение if (cell == nil) создать ячейку,
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
//Configure cell
return cell;
}
Ответ 2
Пожалуйста, , если вы используете пользовательский класс для своей ячейки, проверьте, что вы уже зарегистрировали nib для ячейки, которая будет использоваться в вашем представлении таблицы, следующим образом:
>
[self.yourTableViewName registerNib:[UINib nibWithNibName:@"YourNibName" bundle:nil]
forCellWithReuseIdentifier:@"YourIdentifierForCell"];
Кроме того, убедитесь, что ваш пользовательский подкласс UITableViewCell имеет соответствующий идентификатор повторного использования.
Если вы не используете пользовательский класс, следуйте этим инструкциям в Apple Docs:
Источник данных в своей реализации метода tableView: cellForRowAtIndexPath: возвращает сконфигурированный объект ячейки, который может использовать табличный вид для рисования строки. По соображениям производительности источник данных пытается как можно больше использовать ячейки. Сначала он запрашивает представление таблицы для конкретного объекта ячейки многократного использования, отправив ему dequeueReusableCellWithIdentifier:
Для получения полной информации перейдите по этой ссылке: Создание табличного представления Programmatically.
Надеюсь, это поможет!
Ответ 3
Причиной аварии является использование
[tableView dequeueReusableCellWithIdentifier: forIndexPath:]
что приведет к сбою, если вы не укажете файл ячейки или nib, который будет использоваться для ячейки.
Чтобы избежать сбоя, используйте следующую строку кода
[tableView dequeueReusableCellWithIdentifier:];
Эта строка кода вернет nil, если не используется ячейка.
Вы можете увидеть разницу в документах, которые можно найти здесь.
Также есть хороший ответ на Q & A, который можно найти здесь
Ответ 4
если вы используете UITableViewCell по умолчанию (не настраиваете его) [tableView dequeueReusableCellWithIdentifier: forIndexPath:], вы должны зарегистрироватьсяClass или registerNib; (dequeReusableCellIdentifier: forIndexPath не возвращает нильскую ячейку, если ячейка не существует, то она автоматически создаст новый tableViewCell с UITableViewCellStyelDefault по умолчанию!)
в противном случае вы можете использовать [tableView dequeueReusableCellWithIdentifier] без registerClass или registerNib
Ответ 5
Если вы используете StoryBoard, тогда выберите, что tableviewcontroller- > table- > Cell, дайте ячейке "Идентификатор" в инспекторе атрибутов.
Убедитесь, что вы используете тот же "Идентификатор" в методе cellforrowatindexpath.
Ответ 6
Я знаю, что это немного поздно, чтобы ответить на этот вопрос, но вот что мне не хватает.
Я делал:
let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath)
Но я должен это делать:
let cell = self.tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath)
Обратите внимание: добавлен self.
рядом с tableView.
Надеюсь, это сэкономит вам 24 часа.