Я получаю очень странное поведение в форме 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](https://i.stack.imgur.com/0jvX4.png)
Однако, когда выбран режим 1, происходит очень странное поведение. Вместо того, чтобы раздел 2 выглядел так же, как верхняя половина режима 2, сборщик заменяется ползунком, как показано здесь: ![Mode 1 bug](https://i.stack.imgur.com/gbiXl.png)
Кроме того, на самом деле происходит следующее: Slider, который должен быть Picker, на самом деле является клоном слайдера для sliderValue1 с той же привязкой, функциональностью и адресом. Чтобы сделать что-то странное, у меня есть версия приложения iPhone и iPad, и это происходит только в версии iPhone. Единственное отличие в коде состоит в том, что это на самом деле не является основным ContentView приложения, и в версии iPhone оно отображается в полноэкранном режиме, тогда как в iPad оно находится на боковой панели.
РЕДАКТИРОВАТЬ: Это происходит только в версии iPhone реального устройства. Этого не происходит при запуске версии iPhone в симуляторе.
Я попытался очистить папку сборки, но это не помогло. Единственная другая подсказка, которую я имею, это то, что где-то в моих коммитах я обнаружил некоторые несохраненные, спрятанные изменения в моем файле xcschememanagement.plist. Возможно ли, что этот файл вызывает проблему? Если так, то как бы это исправить?