我有一个NSArray(称为masterArray),其中包含2种不同类型的对象-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无法从其dataSource获取单元格”。我也查看了其他问题来回答这个问题。 This one说要添加行
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。
答案 0 :(得分:1)
在使用带有ID的dequeueReusableCellWithIdentifier之前,您需要像下面这样注册该ID:
@Override
protected void onResume() {
super.onResume();
DisplayManager manager = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE);
Display[] displays = manager.getDisplays(DisplayManager.DISPLAY_CATEGORY_PRESENTATION);
if (displays.length > 0) {
Presentation presentation = new MyPresentation(this, displays[0]);
presentation.show();
}
}
其他说明:
- (void)viewDidLoad {
[super viewDidLoad];
self.tableView = ...;
[self.tableView registerClass:[cell1 class] forCellReuseIdentifier:@"obj1Cell"];
[self.tableView registerClass:[cell2 class] forCellReuseIdentifier:@"obj2Cell"];
}
是多余的,因为在实践中它永远不会为零。