swift - 当 SwiftUI Picker 选择发生变化时,有没有办法调用函数?
问题描述
当 selectedOption 的值发生变化时,我想调用一个函数。在 SwiftUI 中是否有类似于编辑 TextField 的方法?
具体来说,我想在用户更改 selectedOption 时保存所选选项。
这是我的选择器:
struct BuilderPicker: View {
let name: String
let options: Array<String>
@State var selectedOption = 0
var body: some View {
HStack {
Text(name)
.font(.body)
.padding(.leading, 10)
Picker(selection: $selectedOption, label: Text(name)) {
ForEach(0 ..< options.count) {
Text(self.options[$0]).tag($0)
}
}.pickerStyle(SegmentedPickerStyle())
.padding(.trailing, 25)
}.onTapGesture {
self.selectedOption = self.selectedOption == 0 ? 1 : 0
}
.padding(.init(top: 10, leading: 10, bottom: 10, trailing: 0))
.border(Color.secondary, width: 3)
.padding(.init(top: 0, leading: 15, bottom: 0, trailing: 15))
.font(.body)
}
}
我还是 SwiftUI 的新手,希望能得到一些帮助。谢谢!
解决方案
如果 @State 值将在视图中使用,则不需要额外的变量name
struct BuilderPicker: View {
// let name: String = ""
let options: Array<String> = ["1", "2","3","4","5"]
@State var selectedOption = 0
var body: some View {
HStack {
Text(options[selectedOption])
.font(.body)
.padding(.leading, 10)
Picker(selection: $selectedOption, label: Text(options[selectedOption])) {
ForEach(0 ..< options.count) {
Text(self.options[$0]).tag($0)
}
}.pickerStyle(SegmentedPickerStyle())
.padding(.trailing, 25)}
// }.onTapGesture {
// self.selectedOption = self.selectedOption == 0 ? 1 : 0
// }
.padding(.init(top: 10, leading: 10, bottom: 10, trailing: 0))
.border(Color.secondary, width: 3)
.padding(.init(top: 0, leading: 15, bottom: 0, trailing: 15))
.font(.body)
}
}
如果您需要对@State 进行单独操作,最简单的方法是在视图中添加一行:onReceive()。
HStack {
Text("")
.font(.body)
.padding(.leading, 10)
Picker(selection: $selectedOption, label: Text("")) {
ForEach(0 ..< options.count) {
Text(self.options[$0]).tag($0)
}
}.pickerStyle(SegmentedPickerStyle())
.padding(.trailing, 25)}
// }.onTapGesture {
// self.selectedOption = self.selectedOption == 0 ? 1 : 0
// }
.padding(.init(top: 10, leading: 10, bottom: 10, trailing: 0))
.border(Color.secondary, width: 3)
.padding(.init(top: 0, leading: 15, bottom: 0, trailing: 15))
.font(.body)
.onReceive([self.selectedOption].publisher.first()) { (value) in
print(value)
}
推荐阅读
- recursion - 将尾递归序言代码重写为简单递归
- json - json.decode(response.body)...“这里 response.body 不工作...”
- set - Abaqus:以下部分有一些元素没有分配任何部分/复合层
- bash - x 秒后停止使用 minicom 检索调制解调器信息
- android - 如何避免在viewpager swipe上刷新recyclerview刷新?
- c++ - CLion 没有正确检测到作为 CUDA 编译器的 clang
- c# - 在另一个数组c#中初始化对象数组
- google-cloud-platform - 在 Google Cloud 中创建 CDN 代理以进行细分分析
- javascript - 如何从 Edge 中的 Javascript 中清除 DNS 缓存
- sql - AS400 SQL 中的分页