我的tableview中有一个自定义单元格列表,当我滚动时,一切看起来都很好,单元格看起来是相同的顺序。我有我的单元格的一些功能 - 因为我选择一个单元格(并动态扩展)背景颜色更改和一些其他自定义单元格属性。一旦我这样做然后我开始滚动,我之前甚至没有触摸的不同单元格出现,选择(展开)并且单元格仅在我手动选择正确的数据时更新。我似乎看到了重复和各种疯狂。
我知道到目前为止有很多关于此的帖子,但对我来说,到目前为止还没有任何效果。想要我可以做些什么来阻止这种荒谬的行为。
我发布了一些代码,让您更好地了解我在做什么。我知道'dequeueReusableCellWithIdentifier'是罪魁祸首,但不知道另一种选择。
作为附注,这是一个tableview(它自己的xib),它是一个大视图(也是一个xib)的子视图。我也已经为tableview注册了nib。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:myIndentifier forIndexPath:indexPath];
if(self.currentSelectedIndex){
if(self.previousSelectedIndex){
//collapse cell
//configure cell in method(change background color etc)
}
else{
//expand cell
//configure cell in method(change background color etc)
}
}
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
self.currentSelectedIndex = indexPath;
[tableView beginUpdates];
if(self.currentSelectedIndex){
if(self.previousSelectedIndex && (self.previousSelectedIndex != self.currentSelectedIndex)){
[tableView reloadRowsAtIndexPaths:@[self.currentSelectedIndex, self.previousSelectedIndex] withRowAnimation:UITableViewRowAnimationAutomatic];
}
else{
[tableView reloadRowsAtIndexPaths:@[self.currentSelectedIndex] withRowAnimation:UITableViewRowAnimationAutomatic];
}
}
[tableView endUpdates];
if(self.previousSelectedIndex == self.currentSelectedIndex){
self.previousSelectedIndex = nil;
}
else{
self.previousSelectedIndex = self.currentSelectedIndex;
}
}
我该怎么办?如何确保列表中的其他内容“似乎”未被选中(展开)或阻止在滚动时看到重复项?我已经跟踪了我当前和最后选择的索引(如代码所示),所以我想我可以以某种方式使用它?
答案 0 :(得分:0)
重新登记的单元格
知道细胞被重复使用,因此UITableViewCell
的外观在该细胞的整个生命周期中都是持久的。
这意味着如果您没有明确reset
单元格的所有演示文稿视图,并且只是在cellForRowAtIndexPath
中将其保持不变,那么您返回的内容可能是当前选中(或取消选择)的缓存细胞
重置表格单元格的可能位置是prepareForReuse
。
设计说明:
您如何维护self.currentSelectedIndex
和self.previousSelectedIndex
?这通常非常危险,因为您试图复制UITableView
行为。例如,它不太可能适用于多种选择。设置活动选项不太可能处理操作系统didDeselectRowAtIndexPath
的情况,例如键盘解雇的结果。