UITableViewCell 可重用性问题。修改一个单元格正在影响其他单元格

Posted

技术标签:

【中文标题】UITableViewCell 可重用性问题。修改一个单元格正在影响其他单元格【英文标题】:UITableViewCell reusability issue. Modifying one cell is affecting others 【发布时间】:2016-08-29 04:22:45 【问题描述】:

Whenever a cell from section 3 is selected.我正在更新 DataSource 数组,因此单元格的背景颜色正在正确更改。

但是,每当我向上滚动时,我开始看到具有修改过背景颜色的随机单元格,我知道我什至没有在我的 cellForRowAtIndexPath 方法中提及它,并且我的 tableView 中的每个部分都是从单独的数据源填充的Array/Dictionary!

(我正在使用 Storyboard 来处理所有 UI 设置)

这是我的代码(关注第 3 节)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

ECTextFieldTableViewCell *cell  = [tableView dequeueReusableCellWithIdentifier:kSettingsTextFieldCellReuseIdentifier
                                                                  forIndexPath:indexPath];

if (indexPath.section == 0) 

    cell.cellTextField.text = [self.personalInfoDataSource valueForKey:kUserValuesKey][indexPath.row];

  else if (indexPath.section == 1) 

     cell.cellTextField.text = [self.contactInfoDataSource valueForKey:kUserValuesKey][indexPath.row];

  else if (indexPath.section == 2) 

     cell.cellTextField.text = [self.professionalDetailsDataSource valueForKey:kUserValuesKey][indexPath.row];

  else if (indexPath.section == 3)  //---- Problems here 

     UserMeta *metaObj = self.interestDataSource[indexPath.row];

     cell.cellTextField.userInteractionEnabled = NO;
     cell.cellTextField.text = metaObj;

     if (self.user.INTEREST.count > 0 && [self.user.INTEREST contains:metaObj.name] ) 
         cell.backgroundColor = [UIColor redColor];
              
 

 return cell;

这里是我进行所有数据源修改的地方

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

if (indexPath.section == 0 && indexPath.row == 2) 

    // Do Stuff

 else if (indexPath.section == 3)  //---- Problems here 

    ECTextFieldTableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];

    cell.backgroundColor = [UIColor redColor];

    UserMeta *metaObj = self.interestDataSource[indexPath.row];
    [self.user.INTEREST addObject:metaObj];

 


【问题讨论】:

【参考方案1】:

正如您所写,单元格被重复使用。在第 3 节中显示的单元格可以在第 0 节中重复使用。

因此,您必须确保将所有参数设置为已定义的状态。

这意味着如果您将userInteractionEnabled 设置为NO 并且在第3 部分将背景颜色设置为红色,您必须将userInteractionEnabled 设置为YES 并将颜色设置为所有其他部分的默认颜色.此外,如果条件为假,则必须将颜色设置为第 3 节中的默认颜色。

【讨论】:

好点。在我开始为每个indexPath 自定义我的单元格之前,我最终向cellForRowAtIndexPath 添加了一些“默认单元格”代码,这就成功了!以下是我所做的修改:cell.userInteractionEnabled = YES; cell.cellTextField.placeholder = @""; cell.cellTextField.text = @""; cell.cellAccessoryView.image = nil;【参考方案2】:

因为滚动时会重复使用表格单元格,所以您不能对其初始状态做出任何假设。在cellForRowAtIndexPath 中,您需要在所有条件下设置背景颜色,而不仅仅是在有限的一组条件下。例如,您可以在单元格出列后将背景颜色设置为白色,然后在if 语句的一个分支中将其设置为红色。

【讨论】:

以上是关于UITableViewCell 可重用性问题。修改一个单元格正在影响其他单元格的主要内容,如果未能解决你的问题,请参考以下文章

带有 UICollectionViewCell 的可重用 UITableViewCell

无法从出列可重用 UITableViewCell 加载自定义单元格

是否有带有标签和文本字段的可重用 UITableViewCell?

软件测试之维护性测试

自定义 UITableViewCell 可访问性

iOS - 如何在不同的 UITableViewCell 中重用 UIView