UITableView中cell.accessoryType中的问题

时间:2011-04-28 14:45:20

标签: iphone objective-c arrays uitableview

在我的应用程序中,如果用户按下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单元格...即使我没有选择那些单元格...我不知道为什么以及如何自动检查...
我希望有人知道问题出在哪里 非常感谢你

2 个答案:

答案 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,以便在新状态下重绘单元格。