У меня есть 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.