UISegmentedControl.noSegment перестал работать с Xcode 11, iOS 13 - PullRequest
1 голос
/ 23 сентября 2019

У меня было два сегментированных элемента управления, наложенных друг на друга, каждый с двумя опциями, так что есть сетка опций фильтрации 2x2 для поля поиска.Это работало нормально, но я только что обновился до Xcode 11 и UISegmentedControl.noSegment перестал работать, когда я пытаюсь обновить его в ответ на выбор пользователя.Однако это работает, когда я устанавливаю начальное значение .noSegment в наблюдателе свойств.isMomentary имеет значение false.Розетки все настроены правильно.Есть ли какое-то обновление для UISegmentedControl поведения, которое я пропускаю, или это ошибка?

Новое, некорректное поведение показано здесь .

Текущий код, который работалдо и перестал работать после обновления:

@IBOutlet private weak var segmentedControlOne: UISegmentedControl!

@IBOutlet private weak var segmentedControlTwo: UISegmentedControl! {
    didSet {
        // Start with no segment selected on this control. This works!
        segmentedControlTwo.selectedSegmentIndex = -1
    }
}

@IBAction private func oneIndexChanged(_ sender: UISegmentedControl) {
    //Turn off selection on second control while first is selected
    segmentedControlTwo.selectedSegmentIndex = UISegmentedControl.noSegment

    let i = sender.selectedSegmentIndex
    if i == 0 {
        searchType = .users
    } else {
        searchType = .contributors
    }
}

@IBAction private func twoIndexChanged(_ sender: UISegmentedControl) {
    //Turn off selection on first control while second is selected
    segmentedControlOne.selectedSegmentIndex = UISegmentedControl.noSegment

    let i = sender.selectedSegmentIndex
    if i == 0 {
        searchType = .articles
    } else {
        searchType = .categories
    }
}

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

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

Хотя Apple, надеюсь, скоро исправит эту ошибку, я реализовал следующий обходной путь, воссоздав сегменты.Этот пример кода основан на UISegmentedControl с изображениями в качестве сегментов. Конечно, вы можете реализовать тот же подход для строк заголовка:

public func resetSegmentedControl(_ control: UISegmentedControl) {
    if #available(iOS 13, *) {
        // workaround: recreate the segments
        let numSegments = control.numberOfSegments
        let segmentImages = (0..<numSegments).compactMap { control.imageForSegment(at: $0) }
        control.removeAllSegments()
        for (index, image) in segmentImages.enumerated() {
            control.insertSegment(with: image, at: index, animated: false)
        }
    } else {
        // for earlier versions of iOS, just reset the selectedSegmentIndex
        control.selectedSegmentIndex = UISegmentedControl.noSegment
    }
}

При удалении и повторной вставке сегментов наблюдается небольшое мерцание, нодля меня это предпочтительнее сломанного состояния.

0 голосов
/ 23 сентября 2019
...