iOS 13 UISegmentedControl внутри UITableView кеширует предыдущий выбор - PullRequest
0 голосов
/ 01 октября 2019

У меня есть экран с UITableView, который отображает одну строку для каждого доступного элемента данных, количество элементов данных может быть сотнями. В зависимости от типа элемента данных в каждой строке отображается либо поле ввода, либо сегментированный элемент управления. Существует проблема с сегментированным элементом управления в iOS 13, когда пользователь касается первого или второго сегмента сегментированной строки управления в верхней части представления и прокручивает его вниз, он автоматически выбирает первый сегмент для некоторой случайной сегментированной строки управления в последующем представлении прокрутки /стр. Похоже, что состояние управления не обновляется.

Вот фрагмент кода функции cellForRowAtIndexPath, в которой создается строка UISegmentedControl.

QuestionOnTopTableViewCell *cell = [aTableView dequeueReusableCellWithIdentifier:@"YesNoInputIdentifier"];
     if (!cell) {
        cell = [[QuestionOnTopTableViewCell alloc] initWithCellStyle:QuestionCellStyleYesNo reuseIdentifier:@"YesNoInputIdentifier"];
     }
     cell.titleLabel.text = row.title;
     cell.segmentControl.selectedSegmentIndex = row.answer ? row.answer.boolValue : UISegmentedControlNoSegment;

Кто-нибудь сталкивался с этой проблемой?

Примечание. Эта проблема возникает только приiOS13.

1 Ответ

1 голос
/ 01 октября 2019

Система будет выделять только достаточное количество ячеек для визуального отображения, а затем, когда один из них прокручивается, он использует его для прокрутки новой ячейки. В результате - когда это происходит, он запоминает предыдущий выбор, как вы видите.

Не уверен, почему этого не произошло до iOS 13 (похоже, ваша функция cellForRowAt: должна установить правильное значение, если вы смотрите на правильную переменную row, но вы должны просто иметь возможностьсбросьте его, переопределив метод UITableViewCell s prepareForReuse().

Swift

class QuestionOnTopTableViewCell: UITableViewCell {

     // stuffs

    override func prepareForReuse() {
        super.prepareForReuse()
        self.segmentControl.selectedSegmentIndex = .noSegment
    }
}

Obj-C

Это должно работать для вас:

-(void)prepareForReuse{
    [super prepareForReuse];
    self.segmentControl.selectedSegmentIndex = UISegmentedControlNoSegment;
}

Редактировать:

Я действительно только что увидел другой вопрос, утверждающий, что .noSegment больше не работает после того, как значение было установлено в сборках iOS13 / Xcode 11: UISegmentedControl.noSegment перестал работать сXcode 11, iOS 13

Вместо этого, к сожалению, вам может понадобиться каждый раз заново создавать локальную версию сегментированного элемента управления и переопределять элемент управления: cell.segmentControl = myNewJustCreatedSegmentControl

youможет бытьвсе еще делаю это в prepareForReuse методе

...