[英]SwiftUI - Picker binding not updating when picker changes
在我看来,我有一个选择器作为分段选择器。 每当我通过滑动更改选择器时,它不会更新/打印更新。 如果我点击它,它会更改/更新。 当我将它从一个选项滑到另一个选项时,希望它更新。 我也尝试使用 a.tag 修饰符而不是 .id,但都不起作用:(
private let options = ["option1","option2"]
@State private var urlMode = 0 {
didSet {
print("url mode set to \(urlMode)")
}
}
var url: String {
if urlMode == 0 {
return "www.google.com"
} else {
return "www.yahoo.com"
}
}
Return ZStack {
Picker("", selection: $urlMode) {
ForEach(0..<options.count) { index in
Text(options[index])
.id(index)
}
}
.pickerStyle(SegmentedPickerStyle())
.padding(.bottom, K.ScreenSize.screenWidth / 50)
.padding(.horizontal)
.onTapGesture {
if urlMode == 0 {
urlMode = 1
} else {
urlMode = 0
}
}
}
事实证明,该值已被设置,但它没有更新/运行我的@State var 的“didSet”部分......对我来说,一个简单的方法是在我的 Picker 上方添加一个 Text,如下所示:
Text("selection: \(options[urlMode])")
当我更改选择器时,这个值更新了......所以,由于某种原因,didSet 没有打印,但它确实运行正常......
如果您正在阅读本文并且需要在此更改时运行代码的另一种方法,请使用上面的 jnpdx 答案,或对您的 Picker 使用 a.onChange 修饰符(确保按原样使用它,而不是作为绑定/使用 $):
.onChange(of: urlMode) { value in
//code to run
}
有多种方法可以实现您正在寻找的链接。 我推荐一个带有@Published
属性的ObservableObject
,您可以使用onReceive
观察它来执行您的打印语句。
该tag
现在也可以与ForEach
一起使用:
class ViewModel : ObservableObject {
let options = ["option1","option2"]
@Published var urlMode = 0
}
struct ContentView: View {
@ObservedObject var viewModel = ViewModel()
var url: String {
if viewModel.urlMode == 0 {
return "www.google.com"
} else {
return "www.yahoo.com"
}
}
var body: some View {
ZStack {
Picker("", selection: $viewModel.urlMode) {
ForEach(Array(viewModel.options.enumerated()), id: \.1.self) { (index,option) in
Text(option).tag(index)
}
}
.pickerStyle(SegmentedPickerStyle())
.padding(.horizontal)
}.onReceive(viewModel.$urlMode) { (mode) in
print("url mode set to \(mode)")
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.