Пытаясь создать простой элемент управления выбором дня в SwiftUI, который имеет стиль выбора Picker с сегментированным набором на 3 дня (первоначально вчера, сегодня, завтра) вместе с кнопками шеврона для перехода назад или вперед во времени, я застрял там, гдетекстовые метки для Picker странным образом обновляются.
Если я увеличиваю переменную состояния, все три текстовых метки средства выбора обновляются, как ожидается. Если я уменьшу переменную состояния, обновятся только первые две текстовые метки.
Вот упрощенный пример, показывающий проблему. Я использую версию Xcode 11.1 (11A1027) и симулятор iOS 13.1. Если вы продолжаете нажимать кнопку «Далее», все три метки обновляются должным образом, но нажимаются «Предыдущая», а третья метка не обновляется. Нажмите «Далее» еще раз, и все три вернутся к отражению правильного состояния.
Мое реальное приложение использует ForEach итерацию по модели данных, включающей массив дат, но этот упрощенный пример демонстрирует то же поведение.
struct ContentView: View {
@State var middleValue = 2
@State var selectedValue = 1
var body: some View {
VStack {
Picker("Item", selection: $selectedValue) {
Text("\(middleValue - 1)").tag(0)
Text("\(middleValue)").tag(1)
Text("\(middleValue + 1)").tag(2)
}
.pickerStyle(SegmentedPickerStyle())
HStack {
Button("Previous") {
self.middleValue -= 1
}
Spacer()
Button("Next") {
self.middleValue += 1
}
}
Spacer()
}
.padding()
}
}
Есть идеи? Тем временем я создал свой собственный элемент управления сегментами, используя кнопки с модификатором, который обеспечивает похожий пользовательский интерфейс, но я озадачен, почему это не работает с SegmentedPickerStyle от Picker.