UITableView清单问题

时间:2010-07-13 19:42:18

标签: iphone objective-c xcode uitableview

我有这个奇怪的问题。我正在使用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;

}

感谢。

2 个答案:

答案 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内),并在需要时轻松访问它们。