Xcode не может удалить ячейку с идентификатором
Моя работа посвящена `UITableView. Каждый раз, когда я запускаю свой проект, появляется эта ошибка:
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
Я проверил сто раз мой идентификатор ячейки в своем раскадровке, и в моем коде все одинаково.
Код (код defaut из 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
для моей ячейки.
Любая идея, почему это не работает?
В любом случае (строка кода) узнать, что является идентификатором ячейки?
Спасибо
Изменить: Снимок экрана моего конструктора интерфейса.
![IB]()
Изменить 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
Вместо:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
Попробуйте:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
Если это не работает, добавьте также:
if (cell == nil) {
cell = [[customCell alloc] init];
}
Ответ 2
Хорошо, ваша проблема в том, что вы используете Static cells
вместо Prototype cells
. Просто измените свой тип содержимого UITableView.
![Prototype cells option]()
Ответ 3
Хорошо, мой проект, наконец, работает. Некоторые ошибки появились о вещах, которые я удалил, и я больше не могу их найти.
Я только что удалил каждый TableViewCell, я должен был создать новый уникальный UITableViewCell
со следующими свойствами:
класс: customCell
Стиль: Основной (но он также работает с Custom)
Идентификатор: Cell1
Спасибо за вашу помощь ssantos, Abdullah Shafique и bilobatum.
Ответ 4
Если ваша ячейка таблицы является подклассом UITableViewCell, вы не используете стиль "Basic" для ячейки. Измените параметр стиля в инспекторе атрибутов на "Пользовательский".
Кроме того, убедитесь, что класс в инспекторе идентификации идентификатора ячейки установлен в ваш пользовательский подкласс таблицы.
Ответ 5
Я полагаю, вы используете статические ячейки. Если вы это сознательно делаете - просто удалите тысячи методов из своего .m файла:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
}
Ответ 6
Если вы намеренно используете Static UITableViewCells, вам не нужно внедрять обычные методы UITableView (numberOfSectionsInTableView:, tableView:numberOfRowsInSection:, tableView:cellForRowAtIndexPath:).
UITableView будет автоматически заполняться из ячеек, определенных в вашем раскадровке. Вы в конечном итоге используете tableView: cellForRowAtIndexPath: для форматирования данных в ячейках. Вы используете [super tableView: cellForRowAtIndexPath:], чтобы получить tableViewCell, а затем ReuseIdentifier, теги или indexPath, чтобы сопоставить ячейку с данными, которые идут с ней.
Ответ 7
попробуйте использовать класс 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;
}
Ответ 8
Причина этой проблемы очень ясна из исключения:
Одним из решений этой проблемы является
зарегистрировать класс для идентификатора
В Swift это можно сделать следующим образом
tableView.registerClass(UITableViewCell.classForKeyedArchiver(), forCellReuseIdentifier: "your_reuse_identifier")
Ответ 9
В моем случае раскадровка, в которой я определил отсутствующий UITableViewCell, была локализована.
Ответ 10
Прокомментируйте весь код в приложении: didFinishLaunchingWithOptions (AppDelegate), но верните YES и повторите попытку.
Ответ 11
Я столкнулся с этой проблемой при представлении UITableViewController, имеющего собственную ячейку из другого диспетчера представлений. В качестве обходного пути я создал его из раскадровки и решил проблему.
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let controller = storyboard.instantiateViewController(withIdentifier: "YourTableViewController")
self.present(controller, animated: true, completion: nil)