【发布时间】:2019-10-22 20:13:57
【问题描述】:
我有一个SwiftUIForm,其中包含一个Picker、一个TextField和一个Text:
struct ContentView: View {
var body: some View {
Form {
Section {
Picker(selection: $selection, label: label) {
// Code to populate picker
}.pickerStyle(SegmentedPickerStyle())
HStack {
TextField(title, text: $text)
Text(text)
}
}
}
}
}
上面的代码会产生以下 UI:
我可以很方便的选择picker中的第二个item,如下图:
在下面,您可以看到我可以通过点击TextField 来启动文本输入:
为了在更新Picker 值时关闭键盘,添加了Binding,可以在以下代码块中看到:
Picker(selection: Binding(get: {
// Code to get selected segment
}, set: { (index) in
// Code to set selected segment
self.endEditing()
}), label: label) {
// Code to populate picker
}
对self.endEditing()的调用通过以下方法提供:
func endEditing() {
sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
}
以下屏幕截图显示,选择 Picker 的不同部分会关闭键盘:
到目前为止,一切都按预期进行。但是,我想在点击TextField 之外的任何位置时关闭键盘,因为我无法弄清楚在拖动 Form 包含滚动视图时如何关闭键盘。
我尝试添加以下实现以在点击 Form 时关闭键盘:
Form {
Section {
// Picker
HStack {
// TextField
// Text
}
}
}.onTapGesture {
self.endEditing()
}
以下两个截图显示TextField能够成为第一响应者并显示键盘。然后在TextField之外点击时成功关闭键盘:
但是,当尝试选择 `Picker.事实上,即使在键盘被关闭后,我也无法选择不同的段。我认为无法选择不同的段,因为附加到表单的点击手势阻止了选择。
以下屏幕截图显示了在显示键盘并实现轻击手势时尝试选择Picker 中的第二个值的结果:
我可以做些什么来允许选择Picker 的段,同时允许在TextField 之外点击时关闭键盘?
【问题讨论】:
标签: swiftui swiftui-form