UITableView行选择毛刺?

时间:2015-11-30 13:11:09

标签: ios objective-c uitableview

我正在开发一个iOS应用程序,用户可以选择自己喜欢的景点。我想在UITableView中使用复选标记来显示此信息。在调试时,我发现当用户选择(例如)4个景点并向下滚动时,其他景点也会有一个复选标记。即使用户没有选择它们。这是一个常见的错误/故障吗?

代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

// Configure the cell...

cell.textLabel.text = items[indexPath.row];

    return cell;
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    [tableView deselectRowAtIndexPath:indexPath animated:YES];

    UITableViewCell *tableCell = [tableView cellForRowAtIndexPath:indexPath];
    BOOL isSelected = (tableCell.accessoryType == UITableViewCellAccessoryCheckmark);

    if (isSelected) {
        tableCell.accessoryType = UITableViewCellAccessoryNone;
    }
    else {
        tableCell.accessoryType = UITableViewCellAccessoryCheckmark;
    }

}

`

在这里.gif file向您展示朗姆酒时发生的事情:

4 个答案:

答案 0 :(得分:3)

这是一个非常常见的错误,但不是iOS。 :)

问题是细胞会被重复使用,如果你改变细胞的一个方面,当它再次给你时,它不会自动重置为任何默认值。

使用的策略是:将“选定”状态保存在用于填充单元格的数据中,然后在cellForRowAtIndexPath中打开或关闭附件。

答案 1 :(得分:0)

这不是错误/故障。它应该是什么。因为您使用的是dequeueReusableCellWithIdentifier。您必须在cellForRowAtIndexPath

中重置单元格的状态

对于选定的单元格,您应该创建一个数组来处理所选的索引。

答案 2 :(得分:0)

您应该在array中保存所选行的列表,然后选中isSelected,检查array是否有该行。

答案 3 :(得分:0)

@property (nonatomic, strong) NSMutableSet *selectedIndexPaths;

- (void)viewDidLoad {
   ...

    _selectedIndexPaths = [NSMutableSet set];

   ...
}

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    ...

    tableCell.accessoryType = ([self.selectedIndexPaths containsObject:indexPath])
        ? UITableViewCellAccessoryCheckmark
        : UITableViewCellAccessoryNone;

    ...
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    ...

    UITableView *tableCell = [tableView cellForRowAtIndexPath:indexPath];

    if ([self.selectedIndexPaths containsObject:indexPath]) {
        [self.selectedIndexPaths removeObject:indexPath];
        tableCell.accessoryType = UITableViewCellAccessoryNone;
    } else {
        [self.selectedIndexPaths addObject:indexPath];
        tableCell.accessoryType = UITableViewCellAccessoryCheckmark;
    }

    ...
}