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

Posted

技术标签:

【中文标题】导航回视图时更新 SwiftUI 选择器最小值和最大值【英文标题】:Update SwiftUI picker minimum and maximum when navigating back to a view 【发布时间】:2019-12-03 18:45:14 【问题描述】:

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

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)"))

【问题讨论】:

【参考方案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)"))
             
       

【讨论】:

你能在课堂上做到这一点吗?我让你的例子正常工作,但那是一个结构。我的模型正在使用一个类,因为它符合 ObservableObject 并且当我使类可散列并消除所有错误时,选择器不会像您的示例中那样更新。 您可以将结构分配给您的类的实例变量。也许这是最快的第一个工作。

以上是关于导航回视图时更新 SwiftUI 选择器最小值和最大值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SwiftUI 中使用按钮导航回一个视图

如何正确处理更新视图中的选取器(SwiftUI)

SwiftUI 导航回上层但不是根视图

SwiftUI 选择器在 ObservedObject 公共变量更新期间滚动时跳转

视图中的 SwiftUI Picker 会在点击时自行禁用

Swiftui Multi Picker 以最小最大值更改选择