在我的应用程序中,如果用户按下UITableView中的任何单元格,则单元格的accessoryType将设置为复选标记,如下所示
-(void)Check:(UITableView *)tableView Mark:(NSIndexPath *)indexPath
{
[self.tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryCheckmark;
buttonCount++;
[selectedCellArray addObject:indexPath];
}
如果用户按下相同的单元格,则取消选中将发生如下
-(void)UnCheck:(UITableView *)tableView Mark:(NSIndexPath *)indexPath
{
[self.tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryNone;
buttonCount--;
if (buttonCount == 0) {
[selectedCellArray removeAllObjects];
}
}
我正在呼唤这个
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if([tableView cellForRowAtIndexPath:indexPath].accessoryType == UITableViewCellAccessoryCheckmark)
{
[self UnCheck:tableView Mark:indexPath];
}
else
{
[self Check:tableView Mark:indexPath];
}
问题是,当我按下第一个单元格时,它调用Check方法并标记单元格,但当我向下滚动时,我发现2-3个更多的cheked单元格...即使我没有选择那些单元格...我不知道为什么以及如何自动检查...
我希望有人知道问题出在哪里
非常感谢你
答案 0 :(得分:2)
因为tableview会重复使用单元格。同时在tableView:cellForRowAtIndexPath:
方法中设置复选标记/附件类型。
答案 1 :(得分:0)
你...我发现这种情况发生了很多。
管理UITableViewCell状态的正确模式不是直接操作TableViewCell来更新UI,而是始终从cellForRowAtIndexPath(或tableView:willDisplayCell:forRowAtIndexPath :)设置,绘制和创建正确的状态
意思是,如果用户点击单元格并且您需要更新该单元格的UI,则将该单元格的新状态存储在数组或字典中(我发现NSIndexPath作为键的NSMutableDictionary非常有效) )。
然后调用reloadRowsAtIndexPaths:withRowAnimation:或者只调用[tableView reloadData],以便cellForRowAtIndexPath读取该数组或Dictionary并正确绘制单元格。
否则,cellForRowAtIndexPath将不断覆盖您的更改并使用保持不正确状态的回收单元格。
这个规则的一个例外是,如果你想在两个状态之间有一个漂亮的动画......如果是这样的话,保存你的新状态,在单元格上执行你的动画,然后当动画完成时,调用相同的reloadRowsAtIndexPaths:withRowAnimation或reloadData,以便在新状态下重绘单元格。