ios - SwiftUI - 选择器更改时选择器绑定不更新
问题描述
在我看来,我有一个选择器作为分段选择器。每当我通过滑动更改选择器时,它不会更新/打印更新。如果我点击它,它会更改/更新。当我将它从一个选项滑到另一个选项时,希望它更新。我还尝试使用 .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
}
}
}
解决方案
有多种方法可以实现您正在寻找的链接。我推荐一个ObservableObject
with@Published
属性,你可以观察它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)")
}
}
}
推荐阅读
- flutter - 如何更改所选 NavigationRailDestination 的颜色?
- python-3.x - xlsxwriter 格式正在破坏我的 excel 文件
- javascript - 将价格作为复选框添加到 Shopify 集合过滤(无标签)
- python - 如何在python中加载多个bmp文件
- javascript - 未知选项:.name
- azure - Cosmos DB 和 Azure 上的 Hangfire - 突然开始发送许多请求
- c++ - 如何从 Stopwatch 类测试 restart() 方法?
- git - 如何在 Visual Studio 2019 中执行“git checkout”?
- excel - 如何根据数字是否在特定范围和特定类别中获得结果?
- javascript - 有没有办法请求服务器不使用 Transfer-Encoding: 在 XMLHttpRequest 上分块来回答请求?