SwiftUI 在点击 segmentedControl 时关闭键盘
SwiftUI dismiss keyboard when tapping segmentedControl
我在 SwiftUI 中有一个 TextField,它需要使用不同的键盘,具体取决于由 SegementedControl() 选择器确定的 @State 变量的值。
如何在用户点击不同的片段时关闭键盘(例如发送 endEditing 事件)?我需要这样做,因为我想更改键盘类型,如果 textField 是响应程序,则键盘不会更改。
我有这个分机:
extension UIApplication {
func endEditing() {
sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
}
}
我可以做类似的事情
UIApplication.shared.endEditing()
但我不知道当用户点击不同的段时在哪里或如何调用它。
我已经尝试在选择器上放置一个 tapGesture 并且键盘确实消失了,但是点击没有传递到选择器所以它没有改变。
这里的代码片段:
@State private var type:String = "name"
。
.
.
Form {
Section(header: Text("Search Type")) {
Picker("", selection: $type) {
Text("By Name").tag("name")
Text("By AppId").tag("id")
}.pickerStyle(SegmentedPickerStyle())
}
Section(header: Text("Enter search value")) {
TextField(self.searchPlaceHolder, text: $searchValue)
.keyboardType(self.type == "name" ? UIKeyboardType.alphabet : UIKeyboardType.numberPad)
}
}
将自定义 Binding
附加到 Picker
,只要设置它就会调用 endEditing()
:
Section(header: Text("Search Type")) {
Picker("", selection: Binding(get: {
self.type
}, set: { (res) in
self.type = res
UIApplication.shared.endEditing()
})) {
Text("By Name").tag("name")
Text("By AppId").tag("id")
}.pickerStyle(SegmentedPickerStyle())
}
更新自 iOS 13 / iPadOS 13 发布。
由于现在在一个应用程序中支持多个 windows 您需要循环遍历 UIWindows 并逐个结束编辑。
UIApplication.shared.windows.forEach { [=10=].endEditing(false) }
SwiftUI 2.0
现在可以使用 .onChange
以更优雅的方式完成(实际上它可以附加到任何视图,但在 TextField
看起来很合适,是有意的)
TextField("Placeholder", text: $searchValue)
.keyboardType(self.type == "name" ? UIKeyboardType.alphabet : UIKeyboardType.numberPad)
.onChange(of: type) { _ in
UIApplication.shared.endEditing() // << here !!
}
SwiftUI 1.0+
与上述方法有很多相似之处
a) 需要 import Combine
...
TextField("Placeholder", text: $searchValue)
.keyboardType(self.type == "name" ? UIKeyboardType.alphabet : UIKeyboardType.numberPad)
.onChange(of: type) { _ in
UIApplication.shared.endEditing()
}
.onReceive(Just(type)) { _ in
UIApplication.shared.endEditing() // << here !!
}
b) ... 而不是
TextField("Placeholder", text: $searchValue)
.keyboardType(self.type == "name" ? UIKeyboardType.alphabet : UIKeyboardType.numberPad)
.onReceive([type].publisher) { _ in
UIApplication.shared.endEditing() // << here !!
}
对于 SwiftUI 3,使用 FocusState 和 .focused(…)
我在 SwiftUI 中有一个 TextField,它需要使用不同的键盘,具体取决于由 SegementedControl() 选择器确定的 @State 变量的值。
如何在用户点击不同的片段时关闭键盘(例如发送 endEditing 事件)?我需要这样做,因为我想更改键盘类型,如果 textField 是响应程序,则键盘不会更改。
我有这个分机:
extension UIApplication {
func endEditing() {
sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
}
}
我可以做类似的事情
UIApplication.shared.endEditing()
但我不知道当用户点击不同的段时在哪里或如何调用它。
我已经尝试在选择器上放置一个 tapGesture 并且键盘确实消失了,但是点击没有传递到选择器所以它没有改变。
这里的代码片段:
@State private var type:String = "name"
。 . .
Form {
Section(header: Text("Search Type")) {
Picker("", selection: $type) {
Text("By Name").tag("name")
Text("By AppId").tag("id")
}.pickerStyle(SegmentedPickerStyle())
}
Section(header: Text("Enter search value")) {
TextField(self.searchPlaceHolder, text: $searchValue)
.keyboardType(self.type == "name" ? UIKeyboardType.alphabet : UIKeyboardType.numberPad)
}
}
将自定义 Binding
附加到 Picker
,只要设置它就会调用 endEditing()
:
Section(header: Text("Search Type")) {
Picker("", selection: Binding(get: {
self.type
}, set: { (res) in
self.type = res
UIApplication.shared.endEditing()
})) {
Text("By Name").tag("name")
Text("By AppId").tag("id")
}.pickerStyle(SegmentedPickerStyle())
}
更新自 iOS 13 / iPadOS 13 发布。
由于现在在一个应用程序中支持多个 windows 您需要循环遍历 UIWindows 并逐个结束编辑。
UIApplication.shared.windows.forEach { [=10=].endEditing(false) }
SwiftUI 2.0
现在可以使用 .onChange
以更优雅的方式完成(实际上它可以附加到任何视图,但在 TextField
看起来很合适,是有意的)
TextField("Placeholder", text: $searchValue)
.keyboardType(self.type == "name" ? UIKeyboardType.alphabet : UIKeyboardType.numberPad)
.onChange(of: type) { _ in
UIApplication.shared.endEditing() // << here !!
}
SwiftUI 1.0+
与上述方法有很多相似之处
a) 需要 import Combine
...
TextField("Placeholder", text: $searchValue)
.keyboardType(self.type == "name" ? UIKeyboardType.alphabet : UIKeyboardType.numberPad)
.onChange(of: type) { _ in
UIApplication.shared.endEditing()
}
.onReceive(Just(type)) { _ in
UIApplication.shared.endEditing() // << here !!
}
b) ... 而不是
TextField("Placeholder", text: $searchValue)
.keyboardType(self.type == "name" ? UIKeyboardType.alphabet : UIKeyboardType.numberPad)
.onReceive([type].publisher) { _ in
UIApplication.shared.endEditing() // << here !!
}
对于 SwiftUI 3,使用 FocusState 和 .focused(…)