1

在我的最新应用程序中创建清单时遇到了问题。

当我调用时didSelectRowAtIndexPath,它会更改imageViewCustomCell 中的一个。因此,当我单击表格中的一行时,它会将 CustomCell 图像切换为复选标记。它工作正常,但是,当我向下滚动时,我注意到它还在我的清单中设置了一些其他行。我发现如果我触摸第 1 行……它会更新 1、11、21、31、41 等。

如何让它只更改第 1 行的图像?IndexPath 是否以某种方式最大为 10?

谢谢!!

didSelectRowAtIndexPath 代码:

{
    CustomCell *cell = (CustomCell *) [resultsTable cellForRowAtIndexPath:indexPath];
    cell.puckSelect.image = [UIImage imageNamed:@"puck_c.png"];
    [cell setNeedsDisplay]
}

我的清单有数千个项目,这会影响这个吗?

4

3 回答 3

2

这是因为您在滚动列表时会重复使用您的单元格。不要将状态存储在单元格中(即选择了哪个单元格)!始终从数据结构(NSArray 等)中读取单元格的状态。

我倾向于这样做:

  • 在 didSelectRowAtIndexPath 中,更改数据结构(例如,将第 23 行的“isSelected”设置为“是”)
  • 然后使用 reloadRowsAtIndexPaths 强制表重新加载这一行
  • 在 cellForRowAtIndexPath 中,从数据结构中读取以确定该行是否有刻度。
于 2013-03-06T16:21:02.933 回答
1

您正在看到细胞重用在工作中。当你想改变状态时,你不能只更新单元格本身,因为 iOS 会在单元格离开屏幕时回收它并在另一行中重用它。您必须以某种方式记录检查了哪些行,并且当准备好在 中显示单元格时-tableView:cellForRowAtIndexPath,适当地设置 的值puckSelect.image

于 2013-03-06T16:20:40.903 回答
0

您可以在 didSelectRowAtIndexPath 中更改数据源,或者设置您在 cellForRowAtIndexPath 中检查的属性的值。像这样的东西:

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    cell.textLabel.text = [self.theData objectAtIndex:indexPath.row];
    if (indexPath.row == self.checkedIndexPath.row) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    }else{
        cell.accessoryType = UITableViewCellAccessoryNone;
    }
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    self.checkedIndexPath = indexPath;
    [tableView reloadData];
}
于 2013-03-06T16:25:32.157 回答