我正在开发一个使用选择器的SwiftUI
应用程序。我有6个选择器,我希望能够为其设置minimum
和maximum
的值。我有一个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)
}
}
答案 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)")})
}
}
}