我正在开发一个iOS应用程序,用户可以选择自己喜欢的景点。我想在UITableView
中使用复选标记来显示此信息。在调试时,我发现当用户选择(例如)4个景点并向下滚动时,其他景点也会有一个复选标记。即使用户没有选择它们。这是一个常见的错误/故障吗?
代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
// Configure the cell...
cell.textLabel.text = items[indexPath.row];
return cell;
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:YES];
UITableViewCell *tableCell = [tableView cellForRowAtIndexPath:indexPath];
BOOL isSelected = (tableCell.accessoryType == UITableViewCellAccessoryCheckmark);
if (isSelected) {
tableCell.accessoryType = UITableViewCellAccessoryNone;
}
else {
tableCell.accessoryType = UITableViewCellAccessoryCheckmark;
}
}
`
在这里.gif file向您展示朗姆酒时发生的事情:
答案 0 :(得分:3)
这是一个非常常见的错误,但不是iOS。 :)
问题是细胞会被重复使用,如果你改变细胞的一个方面,当它再次给你时,它不会自动重置为任何默认值。
使用的策略是:将“选定”状态保存在用于填充单元格的数据中,然后在cellForRowAtIndexPath
中打开或关闭附件。
答案 1 :(得分:0)
这不是错误/故障。它应该是什么。因为您使用的是dequeueReusableCellWithIdentifier
。您必须在cellForRowAtIndexPath
对于选定的单元格,您应该创建一个数组来处理所选的索引。
答案 2 :(得分:0)
您应该在array
中保存所选行的列表,然后选中isSelected
,检查array
是否有该行。
答案 3 :(得分:0)
@property (nonatomic, strong) NSMutableSet *selectedIndexPaths;
- (void)viewDidLoad {
...
_selectedIndexPaths = [NSMutableSet set];
...
}
- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
...
tableCell.accessoryType = ([self.selectedIndexPaths containsObject:indexPath])
? UITableViewCellAccessoryCheckmark
: UITableViewCellAccessoryNone;
...
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
...
UITableView *tableCell = [tableView cellForRowAtIndexPath:indexPath];
if ([self.selectedIndexPaths containsObject:indexPath]) {
[self.selectedIndexPaths removeObject:indexPath];
tableCell.accessoryType = UITableViewCellAccessoryNone;
} else {
[self.selectedIndexPaths addObject:indexPath];
tableCell.accessoryType = UITableViewCellAccessoryCheckmark;
}
...
}