首页 > 解决方案 > 导航回视图时更新 SwiftUI 选择器最小值和最大值

问题描述

我正在开发一个使用选择器的SwiftUI应用程序。我有 6 个选择器,我希望能够为其设置minimummaximum值。我有一个单独的视图来steppers设置每个. 所有变量都存储在环境中。现在,从设置视图导航回主视图时,选择器不会更新。在您移动拾取器之前,它们不会改变。当视图导航回来时,有没有办法让选择器的最小值和最大值发生变化,而不必先移动选择器?这是我的选择器之一的示例:minimummaximumpicker

Picker(selection: self.$ticket.pick1, label: Text("")) {
         ForEach(self.ticket.min1 ... self.ticket.max1, id: \.self) {
               Text("\($0)").frame(width: geometry.size.width / 6)
         }
}

以下是最小和最大步进器之一的示例:

Text("Pick One").fontWeight(.bold)
Stepper(value: $ticket.min1, in: 1...100, label: {Text("Minimum: \(ticket.min1)")})
Stepper(value: $ticket.max1, in: 1...100, label: {Text("Maximum: \(ticket.max1)")})

标签: iosswiftswiftuipicker

解决方案


当您需要picker实时更改范围时,您可以考虑.id(). 下面的例子可以解决这个特定的问题。它可能涉及真实复杂情况中的其他情况,例如数据绑定。但那是另一回事了。

struct Ticket : Hashable{
     var min1 : Int
     var max1 : Int
     var pick1 : Int
}

struct CoolPickers: View {
      @State var ticket: Ticket = Ticket(min1: 1, max1: 10, pick1: 2)

      var body: some View {
            GeometryReader { geometry in
                 NavigationView{
                      VStack{
                            NavigationLink("Next", destination: SettingPickersView(ticket: self.$ticket))
                        Picker(selection: self.$ticket.pick1, label: Text("")) {
                            ForEach(self.ticket.min1 ... self.ticket.max1, id: \.self) {
                                    Text("\($0)")
                                    .frame(width: geometry.size.width / 6)
                                }
                        }.id(self.ticket)
                      }
                 }
            }
      }
}

struct SettingPickersView: View {
       @Binding var ticket: Ticket

       var body: some View {
             Group{
                  Text("Pick One").fontWeight(.bold)
                  Stepper(value: $ticket.min1, in: 1...100, label: {Text("Minimum: \(ticket.min1)")})
                  Stepper(value: $ticket.max1, in: 1...100, label: {Text("Maximum: \(ticket.max1)")})
             }
       }
}

推荐阅读