iOS扩展/选定自定义UITableViewCells滚动UITableView时的状态更改

时间:2016-02-06 06:25:32

标签: ios objective-c uitableview uiscrollview tableviewcell

我的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;
    }
}

我该怎么办?如何确保列表中的其他内容“似乎”未被选中(展开)或阻止在滚动时看到重复项?我已经跟踪了我当前和最后选择的索引(如代码所示),所以我想我可以以某种方式使用它?

1 个答案:

答案 0 :(得分:0)

重新登记的单元格

知道细胞被重复使用,因此UITableViewCell的外观在该细胞的整个生命周期中都是持久的。

这意味着如果您没有明确reset单元格的所有演示文稿视图,并且只是在cellForRowAtIndexPath中将其保持不变,那么您返回的内容可能是当前选中(或取消选择)的缓存细胞

重置表格单元格的可能位置是prepareForReuse

设计说明:
您如何维护self.currentSelectedIndexself.previousSelectedIndex?这通常非常危险,因为您试图复制UITableView行为。例如,它不太可能适用于多种选择。设置活动选项不太可能处理操作系统didDeselectRowAtIndexPath的情况,例如键盘解雇的结果。