«UITableView не удалось получить ячейку из своего источника данных» с несколькими настраиваемыми ячейками - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть NSArray (называемый masterArray) с двумя разными типами объектов - object1 и object2.Этим объектам требуются 2 разные ячейки табличного представления (каждая из которых сделана программно), я реализовал это так:


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([[masterArray objectAtIndex:indexPath.row] isKindOfClass:[object1 class]])
    {
        cell1 *cell = (cell1 *)[tableView dequeueReusableCellWithIdentifier:@"obj1Cell"];
        if (cell == nil)
        {
            cell = [[cell1 alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"obj1Cell"];
        }
        //set up labels and stuff
        return cell;
    }

    if ([[masterArray objectAtIndex:indexPath.row] isKindOfClass:[object2 class]])
    {
        cell2 *cell = (cell2 *)[tableView dequeueReusableCellWithIdentifier:@"obj2Cell"];
        if (cell == nil)
        {
            cell = [[cell2 alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"obj2Cell"];
        }
        //set up labels and stuff
        return cell;
    }
    return nil;
}

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


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    newViewController *newVC = [[newViewController alloc]init];
    newVC.item = [masterArray objectAtIndex:indexPath.row];
    [self.navigationController pushViewController:newVC animated:YES];
}

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

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

, поэтому я заменяю строку "cell1 * cell = (cell1 *) ..." на

cell1 *cell = (cell1 *)[tableView dequeueReusableCellWithIdentifier:@"obj1Cell" forIndexPath:indexPath];

все же теперь я получаю ошибку

"'NSInternalInconsistencyException', reason: 'unable to dequeue a cell with identifier obj1cell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard"

, которая не применима в моей ситуации, потому что мои UITableViewCells сделаны программно (нет раскадровки).В этом посте также рекомендуется добавить «UITableViewDelegate, UITableViewDataSource», однако, похоже, это только опция в Swift, а не Objective-C.

1 Ответ

1 голос
/ 15 апреля 2019

Перед использованием dequeueReusableCellWithIdentifier с идентификатором необходимо зарегистрировать этот идентификатор следующим образом:

- (void)viewDidLoad {
    [super viewDidLoad];

    self.tableView = ...;
    [self.tableView registerClass:[cell1 class] forCellReuseIdentifier:@"obj1Cell"];
    [self.tableView registerClass:[cell2 class] forCellReuseIdentifier:@"obj2Cell"];
}

Дополнительные примечания:

  • if (cell == nil) избыточно, потому что на практике оно никогда не равно нулю.
  • В Objective-C принято, чтобы имена классов начинались с префикса приложения (2-3 заглавных буквы) и заглавной буквы, например: MYCell1, MYCell2, MYObject1 и т. Д. (Замените MY чем-то значимым для вас ).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...