2013-09-29 3 views
37

Моя работа посвящена `UITableView. Каждый раз, когда я запускаю мой проект, появляется эта ошибка:Xcode не может удалить ячейку с идентификатором

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'unable to dequeue a cell with identifier Cell1 - must register a nib or a class for the identifier or connect a prototype cell in a storyboard 

Я проверил сто раз моего идентификатора ячейки в моей раскадровке и в моем коде одинаковы. код (УСПЕШНЫЙ код из UITableViewController):

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
    static NSString *CellIdentifier = @"Cell1"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 

    // Configure the cell... 

    return cell; 
} 

Изображение Таблицы Списка Клеточных свойств: enter image description here

Я создал и реализовал подкласс UITableViewCell для моей камеры.

Любая идея, почему это не работает?

Любой способ (строка кода) знать, что является идентификатором ячейки?

Благодаря

Edit: Скриншот моего интерфейса строитель.

IB

Edit 2: Текст customCell.h

#import <UIKit/UIKit.h> 

@interface customCell : UITableViewCell 

@end 
появляется

Новая ошибка при запуске проекта:

[<choixActiviteViewController 0x7591ac0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key Cell1. 

choixActiviteViewController является подклассом UITableViewController и обычай класс контроллера Choix Activite View.

+1

Пожалуйста, приложите соответствующий код. Было бы полезно также воспользоваться скриншотом вашего инспектора атрибутов. – ssantos

+4

Как вы создаете экземпляр своего контроллера? Если он не создается из раскадровки через segue или '[UIStoryboard instantiateViewControllerWithIdentifier:]', ваши прототипы раскадровки не будут зарегистрированы. –

+0

Этот 'UITableViewController' мой первый взгляд. Перед этим есть только контроллер навигации с отношением «rootviewcontroller». – GoldXApp

ответ

79

Вместо:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 

Try:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

, если это не сработает, то, добавить:

if (cell == nil) { 
    cell = [[customCell alloc] init]; 
} 
+0

Это не что-нибудь изменить. – GoldXApp

+0

@GoldXApp См. Мое редактирование ... –

+0

Не работает ... – GoldXApp

2

Если ячейка таблицы подкласс UITableViewCell, то вы не используете стиль «Basic». Измените параметр стиля в инспекторе атрибутов на «Пользовательский».

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

+0

Я изменил на «Основной стиль», чтобы редактировать «Заголовок» в TableViewCell. Я попробовал с «Custom», но с той же ошибкой снова. – GoldXApp

+0

С вашего скриншота это не похоже, что прототипы ваших ячеек являются подклассами ячейки UITableView. Итак, вы не подклассифицируете UITableViewCell? – bilobatum

+0

Да, я думаю, что да. В моей IB каждая ячейка имеет «customCell» в своем пользовательском классе (в Identity inspector). В customCell.h: @interface customCell: UITableViewCell – GoldXApp

24

Хорошо, ваша проблема в том, что вы используете Static cells, а не Prototype cells. Просто измените свой тип содержимого UITableView.

Prototype cells option

+0

Ошибка для каждой ячейки: Соединение «Cell1» не может иметь объект-прототип в качестве адресата. – GoldXApp

+0

На самом деле, у вас должна быть только одна ячейка Prototype. Какая ошибка в любом случае? – ssantos

+0

работает для меня спасибо –

14

Хорошо, мой проект наконец-то работает. Некоторые ошибки появились о вещах, которые я удалил, и я больше не могу их найти.

Я просто удалил каждый TableViewCell я должен был создать новый уникальный UITableViewCell со следующими свойствами:

класс: customCell

Стиль: Основной (но это также работает с таможней)

Идентификатор: Cell1

Спасибо за вашу помощь ssantos, Abdullah Shafique и bilobatum.

+0

Рад, что вы нашли решение! –

+1

база на вашем эксперименте я только что очистил свой проект и ошибка исчезла !! –

1

Если вы намеренно используя статический UITableViewCells, то вы не должны выполнять обычные методы UITableView населения (numberOfSectionsInTableView:, tableView:numberOfRowsInSection:, tableView:cellForRowAtIndexPath:).
UITableView автоматически заполнит из клеток, определенных в раскадровку. Вы в конечном итоге используете tableView: cellForRowAtIndexPath: для форматирования данных в ячейках. Вы используете [super tableView: cellForRowAtIndexPath:], чтобы получить tableViewCell, а затем ReuseIdentifier, теги или indexPath, чтобы сопоставить ячейку с данными, которые идут с ней.

1

попытаться использовать customCell класс вместо UITableViewCell класс.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
static NSString *CellIdentifier = @"Cell1"; 
customCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 

// Configure the cell... 

return cell; 
} 
2

Я полагаю, вы используете статические ячейки. Если you'r делать это сознательно - просто удалить тыс.т. методы из файла .m:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
} 
-1

закомментировать весь код в приложении: didFinishLaunchingWithOptions (AppDelegate), но остаются возвращение YES, и попробуйте еще раз.

0

Причиной этого вопроса является очень ясно, за исключением:

Одним из решений этой проблемы является зарегистрировать класс для идентификатора

В Swift это может быть сделано следующим образом

tableView.registerClass(UITableViewCell.classForKeyedArchiver(), forCellReuseIdentifier: "your_reuse_identifier") 
0

В моем случае Раскадровка, в которой я определил отсутствующий UITableViewCell, была локализована.

-1

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

let storyboard = UIStoryboard(name: "Main", bundle: nil) 
let controller = storyboard.instantiateViewController(withIdentifier: "YourTableViewController") 
self.present(controller, animated: true, completion: nil) 
Смежные вопросы