Подтвердить что ты не робот

Почему я получаю сообщение об ошибке, связанной с тем, что вы не можете выполнить деинхронизацию, когда мой UITableView пытается загрузить?

Я получаю следующую ошибку:

* Завершение приложения из-за неперехваченного исключения "NSInternalInconsistencyException", причина: "невозможно удалить ячейку с идентификатором FontCell - должен зарегистрировать нить или класс для идентификатор или подключить прототип ячейки в раскадровке

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

Вот соответствующий код (стоит отметить, что я подклассифицировал UITableViewCell для параметров настройки):

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.fonts.count;
}

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

    FontCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

    if (!cell) {
        cell = [[FontCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"FontCell"];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
    }

    int row = indexPath.row;

    cell.fontFamilyLabel.text = self.fonts[row];

    return cell;
}

И вот единственный метод, который я изменил в моем подклассе UITableViewCell (FontCell):

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        self.fontFamilyLabel = [[UILabel alloc] initWithFrame:CGRectMake(5, 5, 200, 20)];
        self.fontFamilyLabel.textAlignment = NSTextAlignmentCenter;

        [self.contentView addSubview:self.fontFamilyLabel];
    }
    return self;
}

Что именно я делаю неправильно?

4b9b3361

Ответ 1

Самое простое исправление - просто изменить его на FontCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; Как и в вашем текущем коде, вам нужно будет убедиться, что cell не nil, если вы делаете этот метод.


В качестве альтернативы вы можете зарегистрировать UINib или Class на уровне таблицы, который привязан к @"FontCell"

Например (вверх в viewDidLoad):

[self.tableView registerClass: [FontCell class] forCellReuseIdentifier:@"FontCell"];

Затем вы можете сделать

FontCell *cell = [tableView dequeueReusableCellWithIdentifier:@"FontCell" forIndexPath:indexPath];

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

Ответ 2

Используется метод dequeueReusableCellWithIdentifier:forIndexPath:. В документации для этого метода сказано следующее:

You must register a class or nib file using the registerNib:forCellReuseIdentifier: or registerClass:forCellReuseIdentifier: method before calling this method.

Итак, здесь

[self.tableView registerClass: [FontCell class] forReuseIdentifier: @"FontCell"];

Ответ 3

У меня также была такая проблема, и найденное решение:

Перейдите в Навигатор проектов и выберите "ViewController.h". Добавить

 <UITableViewDelegate, UITableViewDataSource>

после "UIViewController".

Ответ 4

Если вы используете tableview (а не контроллер табличного представления), как я, то по умолчанию не отображаются ячейки.

В раскадровке выберите табличное представление Откройте инспектор атрибутов Измените ячейки прототипа от 0 до 1 Выберите новую отображаемую ячейку таблицы В инспекторе атрибутов установите Identitifier в "FontCell"