UITableView调用UITableCell导致不希望的输出
问题描述:
我试图切换UITableCell单击时的颜色。
代码如下UITableView调用UITableCell导致不希望的输出
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
RowCell *cell = (RowCell*) [tableView cellForRowAtIndexPath:indexPath];
[cell toggle];
}
拨动实际工作,但现在看来似乎高亮显示超过1个细胞。
即,如果10行覆盖当前可见区域,单击第一行将高亮第1行,第11行,第21行等,而不是仅点击第1行。
我该如何防止这种情况发生?
感谢,
三通
答
确保你正确地配置您的细胞tableView:cellForRowAtIndexPath:
。请记住,通过使用dequeueReusableCellWithIdentifier:
您正在重新使用表格视图单元格。第11行的单元格可能与之前在第1行显示的单元格相同。
设置每个单元格的高亮状态,然后由tableView:cellForRowAtIndexPath:
返回。请注意,这可能会要求您将每行的高亮状态存储在除单元格本身以外的其他位置。
答
由于单元格被重新使用,实现tableView:willDisplayCell:forRowAtIndexPath:
并将切换设置为所需的值。当然,您必须在模型中存储每个单元的切换按钮的状态。
答
请记住,单元格是重用的。所以当这个单元格在dequeueReusableCellWithIdentifier:
中交还给你时,它仍然会被切换(并且你可能不会改回它)。您不应该在单元中调用方法,而应该调用用于向单元提供数据的底层数据对象的方法。然后在tableView:willDisplayCell:forRowAtIndexPath:
,你应该做最后的显示清理,就像“切换”可能做的那样。
也可以考虑使用tableView:willDisplayCell:forRowAtIndexPath:,如其他答案中所建议的。苹果公司表示这是为了改变“早期由表格视图设置的基于状态的属性,比如选择和背景颜色,而不是内容。”如果更改单元格的背景颜色是“表格事物”,并且不会反映到数据模型中,那么tableView:willDisplayCell:forRowAtIndexPath:似乎比tableView:cellForRowAtIndexPath:更合适。不过,这两种方法都应该有效。 – 2010-09-10 03:19:48