Ячейка UITableView, отображающая неправильный контент после изменения высоты

Я работаю над реализацией UITableView с тремя разделами. В последней строке второго раздела должен отображаться экземпляр UIPicker.

Таким образом, я изменил высоту для этой конкретной строки, как показано ниже:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    CGFloat rowHeight = self.tableView.rowHeight;
    if (indexPath.section == RedZoneSection && indexPath.row == MonitorConfigRow){
        rowHeight = 162;
        return rowHeight;
    }
    return rowHeight;
}

Однако, когда я добавляю этот код, первая строка ("Только оповещение из") в третьем разделе добавляет UISwitch к своему представлению, которого там быть не должно, как показано ниже:

Ниже я реализую cellForRowAtIndexPath для третьего раздела:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForTimeOfDayRestrictionsRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"SettingsRowCell";

    UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
    }

    cell.backgroundColor = [UIColor colorWithRed:0.922 green:0.937 blue:0.949 alpha:1];

    switch (indexPath.row) {
        case HourTimeZoneRow:
            cell.textLabel.text = NSLocalizedString(@"Only Alert From", @"Only Alert Row");
            break;
        default:
            break;
    }
    return cell;
}

РЕДАКТИРОВАТЬ Конкретный переключатель UIS, который снова отображается в неправильном месте, изначально находится во второй ячейке первого раздела моей таблицы. Ниже приведена реализация cellForRowAtIndexPath для этого раздела:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForSubscribedNotificationsRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"SettingsRowCell";

    UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
    }

    cell.backgroundColor = [UIColor colorWithRed:0.922 green:0.937 blue:0.949 alpha:1];

    UISwitch *cellSwitch = nil;

    switch (indexPath.row) {
        case RowOne:
            cell.textLabel.text = NSLocalizedString(@"Row One", @"Row One");
            cellSwitch = [[UISwitch alloc] init];
            cell.accessoryView = cellSwitch;
            break;

        case RowTwo:
            cell.textLabel.text = NSLocalizedString(@"Row Two", @"Row Two");
                cell.accessoryView = cellSwitch;
                break;
 //            cell.textLabel.text = nil ;
            cell.accessoryView = UITableViewCellAccessoryNone;
            accessoryViewIsShowing = FALSE;
            break;
    }
    if (cell.accessoryView == nil) {
        NSLog(@"Cell accessoryView is nil");
    }
    else if (cell.accessoryView != nil){
        NSLog(@"Cell accessoryView is not nil");
    }

    NSLog(@"Section: %ld, Row: %ld", (long)indexPath.section, (long)indexPath.row);

    return cell;
}

Кто-нибудь знает, почему изменение высоты определенной ячейки приводит к тому, что некорректное содержимое отображается в ячейке в другом разделе?

1 ответ

Решение

Проблема есть из-за ошибки, связанной с переработкой ячеек в tableView:cellForSubscribedNotificationsRowAtIndexPath: метод. Изменение высоты одной из ячеек делает эту ошибку видимой.

Вам нужно добавить код в default чехол для удаления аксессуаров и текста ячейки, который вы добавляете для RowOne а также RowTwo:

default:
    cell.textLabel.text = nil;
    cell.accessoryView = nil;
    break;

В противном случае "переработанная" ячейка в строках, отличных от RowOne а также RowTwo, который раньше был RowOne или же RowTwo, будет содержать старый текст и дополнительное представление, которое было там до того, как ячейка была переработана.

Другой альтернативой для решения этой проблемы будет переопределениеprepareForReuse,

Другие вопросы по тегам