UITableViewCell 可重用性问题。修改一个细胞会影响其他细胞
UITableViewCell reusability issue. Modifying one cell is affecting others
每当第 3 部分中的单元格被选中时。我正在更新 DataSource 数组,因此单元格的背景颜色会正确更改。
然而,每当我向上滚动时,我开始看到具有修改后背景颜色的随机单元格,我知道我什至没有在我的 cellForRowAtIndexPath
方法和 tableView
的每个部分中提及它从单独的数据源 Array/Dictionary
!
填充
(我正在使用情节提要来处理所有 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];
}
}
如您所写,细胞被重复使用。第 3 节中显示的单元格可以在第 0 节中重复使用。
因此您必须确保所有参数设置为定义状态。
这意味着如果您将 userInteractionEnabled
设置为 NO
并且在第 3 部分中根据条件将背景颜色设置为红色,则您必须将 userInteractionEnabled
设置为 YES
并且颜色为所有其他部分中的默认颜色。此外,如果条件为假,您必须将颜色设置为第 3 部分中的默认颜色。
因为 table 单元格在您滚动时会被重复使用,所以您不能对其初始状态做出任何假设。在 cellForRowAtIndexPath
中,您需要在所有条件下设置背景颜色,而不仅仅是在一组有限的条件下。例如,您可以在单元格出队后立即将背景颜色设置为白色,然后在 if
语句的一个分支中将其设置为红色。
每当第 3 部分中的单元格被选中时。我正在更新 DataSource 数组,因此单元格的背景颜色会正确更改。
然而,每当我向上滚动时,我开始看到具有修改后背景颜色的随机单元格,我知道我什至没有在我的 cellForRowAtIndexPath
方法和 tableView
的每个部分中提及它从单独的数据源 Array/Dictionary
!
(我正在使用情节提要来处理所有 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];
}
}
如您所写,细胞被重复使用。第 3 节中显示的单元格可以在第 0 节中重复使用。
因此您必须确保所有参数设置为定义状态。
这意味着如果您将 userInteractionEnabled
设置为 NO
并且在第 3 部分中根据条件将背景颜色设置为红色,则您必须将 userInteractionEnabled
设置为 YES
并且颜色为所有其他部分中的默认颜色。此外,如果条件为假,您必须将颜色设置为第 3 部分中的默认颜色。
因为 table 单元格在您滚动时会被重复使用,所以您不能对其初始状态做出任何假设。在 cellForRowAtIndexPath
中,您需要在所有条件下设置背景颜色,而不仅仅是在一组有限的条件下。例如,您可以在单元格出队后立即将背景颜色设置为白色,然后在 if
语句的一个分支中将其设置为红色。