导航回视图时更新SwiftUI选择器的最小值和最大值

时间:2019-12-03 18:45:14

标签: ios swift swiftui picker

我正在开发一个使用选择器的SwiftUI应用程序。我有6个选择器,我希望能够为其设置minimummaximum的值。我有一个steppers的单独视图,用于设置每个minimum的{​​{1}}和maximum。所有变量都存储在环境中。现在,从设置视图导航回到主视图时,选择器不会更新。在您移动选取器之后,它们才会更改。当视图向后导航时,是否有一种方法必须使选择器的最小值和最大值发生变化,而不必先移动选择器? 这是我的选择器之一的示例:

picker

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

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

1 个答案:

答案 0 :(得分:1)

当您需要实时更改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)")})
             }
       }
}