2016-08-29 3 views
0

Всякий раз, когда выбрана ячейка из раздела 3. Я обновляю массив DataSource, и цвет фона ячейки изменяется правильно.Проблема повторного использования UITableViewCell. Изменение одной ячейки влияет на других

Однако всякий раз, когда я прокручиваю обратно я начинаю видеть случайные клетки с измененным цветом фона, зная, что я даже не упоминать об этом в моем cellForRowAtIndexPath методе и каждый раздел в моем tableView заполняется из отдельного источника данных Array/Dictionary!

(я использую раскадровку, чтобы обрабатывать все настройки пользовательского интерфейса)

Вот мой код (фокус на раздел 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; 
} 

А вот где я делаю все Изменения в DataSource

- (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.

Поэтому вы должны убедиться, что все параметры установлены в определенное состояние.

Это означает, что если вы установите userInteractionEnabledNO к и цвет фона в зависимости от состояния к красному в разделе 3 вы должны установить userInteractionEnabled в YES и цвет цвета по умолчанию во всех других разделах. Кроме того, вы должны установить цвет по умолчанию в разделе 3, если условие ложно.

+0

Хорошая точка. Я закончил тем, что добавил код ячейки «default cell» в «cellForRowAtIndexPath» прямо перед тем, как начать настраивать свои ячейки для каждой «indexPath», и это сделало трюк! Вот сделанные изменения: 'cell.userInteractionEnabled = YES; cell.cellTextField.placeholder = @ ""; cell.cellTextField.text = @ ""; cell.cellAccessoryView.image = nil; ' – Priest

1

Поскольку ячейки таблицы повторно используются при прокрутке, вы не можете делать какие-либо предположения относительно его начального состояния. В cellForRowAtIndexPath вам необходимо установить цвет фона при любых условиях, а не только в ограниченном наборе условий. Например, вы можете установить цвет фона в белый цвет сразу после удаления ячейки, затем установите его на красный ниже в одной ветви инструкции if.