当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
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) }