情况:当用户选择一个单元格时,会向该单元格添加一个按钮。当他们选择新单元格时,该按钮将从上一个单元格中删除并添加到新单元格中。这样可行。问题是当更多数据添加到表中时。所以假设有20个单元格,然后我再添加20个单元格。然后我选择第一个单元格,但是按钮被添加到单元格1 AND单元格21. select委托方法仅注册第一个被选中的单元格。
来自我的didSelectRowAtIndexPath方法:
if (self.selectedCell) {
self.selectedCell.accessoryView = nil;
self.selectedCell = nil;
}
UIButton *downloadButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[downloadButton setTitle:@"Download" forState:UIControlStateNormal];
[downloadButton setFrame:CGRectMake(0, 0, 130, 34)];
self.selectedCell = [self.tableView cellForRowAtIndexPath:indexPath];
self.selectedCell.accessoryView = downloadButton;
[self.selectedCell setNeedsDisplay];
在我的方法中,我向表格添加了更多数据:
if(self.selectedCell){
self.selectedCell.accessoryView = nil;
self.selectedCell = nil;
}
[self.tableView reloadData];
[self.tableView setNeedsLayout];
答案 0 :(得分:5)
细胞被重复使用。在cellForRowAtIndexPath:
,您忘记清除accessoryView
。当重复使用单元格时,accessoryView
会出现。
我喜欢的一种技巧是在accessoryView
中设置tableView:willDisplayCell:forRowAtIndexPath:
。在将单元格放在屏幕上之前调用它。然后你可以做类似的事情:
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
if (cell.isSelected) {
cell.accessoryView = self.downloadButton; // No reason to create a new one every time, right?
}
else {
cell.accessoryView = nil;
}
}