我在SwiftUI中有一个TextField,需要根据SegementedControl()选择器确定的@State变量的值使用其他键盘。
当用户点击另一个段时,如何关闭键盘(例如发送endEditing事件)?我需要这样做,因为我想更改键盘类型,并且如果textField是响应者,则键盘不会更改。
我有这个扩展名:
extension UIApplication {
func endEditing() {
sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
}
}
我可以做类似的事情
UIApplication.shared.endEditing()
但是当用户点击其他细分时,我不知道在哪里或如何称呼它。
我尝试将tapGesture放置在Picker上,并且键盘确实关闭,但是Tap不会传递到Picker,因此它不会改变。
此处的代码段:
@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)
}
}
答案 0 :(得分:2)
由于一个应用程序现在支持多个窗口,因此您需要遍历UIWindows并逐一结束编辑。
UIApplication.shared.windows.forEach { $0.endEditing(false) }
答案 1 :(得分:2)
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 !!
}
答案 2 :(得分:1)
将自定义Binding
附加到Picker
并在设置时调用endEditing()
的{{1}}:
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())
}