UITableViewController通过单元格标识符编辑



acaniChat的ChatViewController有两种不同类型的带有cell标识符的cell: @"MessageCellID"@"TimestampCellID"。如何使只有消息单元格是可编辑的?

我是这么做的。它有点工作,但只有屏幕上的消息单元格是可编辑的。

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    return [[chatContent cellForRowAtIndexPath:indexPath] reuseIdentifier] == MessageCellId;
}

这适用于所有细胞,但这是正确的做法吗?

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    return [[cellMap objectAtIndex:[indexPath row]] isKindOfClass:[Message class]];
}

我的"答案"更多的是建议您使用数据源检查而不是单元格检查来确定单元格是否可编辑。tableView:canEditRowAtIndexPath:是UITableViewDataSource协议消息。它是数据源一部分的原因是b/c,通常是数据模型逻辑决定是否应该编辑特定单元格中的数据。在您的两个示例中,您都使用单元格类型作为单元格中数据类型的代理。

一个更好的检查将类似于您必须在tableView:cellForRowAtIndexPath:中使用的逻辑,以确定使用哪种类型的单元。

如果不知道数据模型的细节,我不能给你确切的代码,但它是这样的:

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    return [self chatDataTypeAtIndexPath:indexPath] == ChatDataTypeMessage;
}

你应该修复第一个选项,'=='操作符将检查指针比较,而不会比较字符串本身,这是由isEqualToString完成的:

所以它应该是这样的:

return[ [[chatContent cellForRowAtIndexPath:indexPath] reuseIdentifier] isEqualToString:MessageCellId];

相关内容

最新更新