Что может быть причиной этой странной ошибки при замене SwiftUI Picker на Slider? - PullRequest
0 голосов
/ 02 мая 2020

Я получаю очень странное поведение в форме SwiftUI, которая, безусловно, является какой-то ошибкой, но я думаю, что должен быть способ ее исправить. По сути, у меня есть форма, в которой пользователь может выбирать между двумя режимами. Режим 1 требует один сборщик и один слайдер. Режим 2 требует два каждого. Я настроил его так, чтобы при выборе режима 1 ненужные сборщик и ползунок исчезали, оставляя один сборщик и один ползунок. Однако, когда это происходит, сборщик необъяснимо заменяется ползунком, в результате чего раздел содержит два ползунка вместо одного. Мне не удалось воспроизвести поведение вне моего реального приложения, которое по нескольким причинам нецелесообразно публиковать, но общий код c выглядит следующим образом:

struct ContentView: View {
    enum Mode : String {
        case one = "One"
        case two = "Two"
    }

    @State private var sliderValue1 : Float = 0.1
    @State private var sliderValue2 : Float = 0.2
    @State private var sliderValue3 : Float = 0.3
    static let modes : [Mode] = [.one, .two]
    @State private var modeIndex : Int = 1
    var mode : Mode {
        return Self.modes[self.modeIndex]
    }
    static let segmentedControlOptions : [String] = ["A", "B", "C"]
    @State private var segmentedControl1Value : Int = 2
    @State private var segmentedControl2Value : Int = 3



    var body: some View {
        Form {
            Section(header: Text("Section 1")) {
                Text("\(self.sliderValue1)")
                Slider(value: self.$sliderValue1)
                Picker("", selection: self.$modeIndex) {
                    ForEach(0..<Self.modes.count) {
                        Text("\(Self.modes[$0].rawValue)")
                    }
                }.pickerStyle(SegmentedPickerStyle())
            }
            Section(header: Text("Section 2")) {
                if self.mode == .one {
                    Picker("", selection: self.$segmentedControl1Value) {
                        ForEach(0..<Self.segmentedControlOptions.count) {
                            Text("\(Self.segmentedControlOptions[$0])")
                        }
                    }.pickerStyle(SegmentedPickerStyle())
                    Text("\(self.sliderValue2)")
                    Slider(value: self.$sliderValue2)
                } else {
                    Picker("", selection: self.$segmentedControl1Value) {
                        ForEach(0..<Self.segmentedControlOptions.count) {
                            Text("\(Self.segmentedControlOptions[$0])")
                        }
                    }.pickerStyle(SegmentedPickerStyle())
                    Text("\(self.sliderValue2)")
                    Slider(value: self.$sliderValue2)
                    Picker("", selection: self.$segmentedControl2Value) {
                        ForEach(0..<Self.segmentedControlOptions.count) {
                            Text("\(Self.segmentedControlOptions[$0])")
                        }
                    }.pickerStyle(SegmentedPickerStyle())
                    Text("\(self.sliderValue3)")
                    Slider(value: self.$sliderValue3)
                }
            }
        }
    }
}

Когда выбран режим 2, все работает и работает нормально, как показано здесь: Mode 2 selected

Однако, когда выбран режим 1, происходит очень странное поведение. Вместо того, чтобы раздел 2 выглядел так же, как верхняя половина режима 2, сборщик заменяется ползунком, как показано здесь: Mode 1 bug

Кроме того, на самом деле происходит следующее: Slider, который должен быть Picker, на самом деле является клоном слайдера для sliderValue1 с той же привязкой, функциональностью и адресом. Чтобы сделать что-то странное, у меня есть версия приложения iPhone и iPad, и это происходит только в версии iPhone. Единственное отличие в коде состоит в том, что это на самом деле не является основным ContentView приложения, и в версии iPhone оно отображается в полноэкранном режиме, тогда как в iPad оно находится на боковой панели.

РЕДАКТИРОВАТЬ: Это происходит только в версии iPhone реального устройства. Этого не происходит при запуске версии iPhone в симуляторе.

Я попытался очистить папку сборки, но это не помогло. Единственная другая подсказка, которую я имею, это то, что где-то в моих коммитах я обнаружил некоторые несохраненные, спрятанные изменения в моем файле xcschememanagement.plist. Возможно ли, что этот файл вызывает проблему? Если так, то как бы это исправить?

...