我有这个奇怪的问题。我正在使用XCode创建一个清单程序,我正在使用UITableView和UITableViewCellAccessoryCheckmark。我可以选择单元格并显示复选标记,但不知何故,我在下面尚未选择的其他单元格也会出现复选标记。任何想法?
这是我的复选标记编码:
- (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell;
cell = [aTableView cellForRowAtIndexPath: indexPath];
cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
我不知道这是否会影响它,但我也实现了这个方法:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"CellIdentifier";
// Dequeue or create a cell of the appropriate type.
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
cell.accessoryType = UITableViewCellAccessoryNone;
}
// Configure the cell.
if(tableView == Table1){
switch(indexPath.section){
case 0:
cell.textLabel.text = [array1 objectAtIndex:indexPath.row];
break;
case 1:
cell.textLabel.text = [array2 objectAtIndex:indexPath.row];
break;
case 2:
cell.textLabel.text = [array3 objectAtIndex:indexPath.row];
break;
}
//cell.textLabel.text = [NSString stringWithFormat:@"Row %d", indexPath.row];
}
if(tableView == Table2){
cell.textLabel.text = [array4 objectAtIndex:indexPath.row];
}
return cell;
}
感谢。
答案 0 :(得分:2)
每次拨打cell.accessoryType
时设置tableView:cellForRowAtIndexPath:
。否则,当你重复使用一个单元格时,你会得到它的accessoryView而不是你期望的那样。
所以,是的,除了查看accessoryType
之外,你需要通过某种方法选择NSIndexPaths时跟踪。
答案 1 :(得分:2)
您应该在数据源(数组)中保留已选中/未选中的信息。
我还建议您删除cell.accessoryType = UITableViewCellAccessoryNone;
行
该行仅针对少数第一个单元格执行。所有其他单元格将被“重用” - 意味着将使用旧的(已经启动的)单元格,并且您将必须修改这些单元格上显示的详细信息(所有内部cellForRowAtIndexPath
都在您现在)
此外,您还必须添加类似的行(类似cell.accessoryType = ([[array objectAtIndex:indexPath.row] boolValue] ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;
)。
一般情况下,我建议您使用一个数组来保存表的数据,此时数组中的每个项都是字典。这样您就可以保存文本和布尔检查标记(在NSNumber内),并在需要时轻松访问它们。