如何解决SwiftUI 从 UITextField 关闭键盘
所以出于我自己的原因,我需要 UITextField 及其委托通常会提供的完全控制,但它被添加到的屏幕是用 SwiftUI 编写的。需要一个 .decimal
键盘,所以没有回车键。
我只剩下 2 个问题,其中 1 个我希望在这里解决。尝试添加一个调用以退出第一响应者并将其添加到页面上的 VStack 基本上会禁用 UITextField,因为我无法调出键盘。
如何在不向页面添加任意额外按钮的情况下关闭此键盘?
示例代码:
Struct CustomTextView: UIViewRepresentable {
/// Insert init,updateView,binding variable,coordinator,etc
func makeView() -> UITextField {
var textField = UITextField()
textField.delegate = context.coordinator
/// Set up rest of textfield parameters such as Font,etc.
return textField
}
}
extension CustomTextView {
class Coordinator: NSObject,UITextFieldDelegate {
/// UITextfield delegate implementations,extra reference to binding variable,etc
/// Primarily textField.shouldChangeCharactersInRange
}
}
struct ContentView: View {
@State viewModel: ViewModel
var body: some View {
VStack {
CustomTextView($viewModel.parameter)
/// Other views
}
.onTap {
/// Attempting to add the generic call to UIApplication for resignFirstResponder here does not allow CustomTextView to ever hold it even when tapped in
}
}
}
出于隐私原因,我无法提供所有代码,但这应该足以证明我的问题。
解决方法
我已经通过在下面的视图中添加此函数来完成此操作。
func hideKeyboard() {
UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder),to: nil,from: nil,for: nil)
}
然后使用 ontapGesture 可以让键盘消失。 例如,您可以在整个视图的背景堆栈上使用它。如果用户点击背景,键盘将消失。
.onTapGesture {
self.hideKeyboard()
}
,
所以我自己发现了一个技巧,一夜之间顿悟。
首先,我想与其他人分享一个非常基本的原因,为什么 inb4cookies 解决方案不够充分。虽然我已经尝试将类似的 resignFirstResponder 调用添加到后台堆栈的 onTap
,但当我单击该字段时,它会触发 VStack
的 onTap。
这可能是因为我使用 UITextField
作为此组件的后端,而不是 SwiftUI TextField
。
然而,它在最终解决方案中被部分使用。我仍然应用它,但有一个额外的步骤。
VStack {
CustomTextView($viewModel.parameter)
.onTap {/*Insert literally any compiling code here*/ }
/// Other views
}
.onTap {
self.hideKeyboard()
}
您会在上面看到,还有一个额外的 onTap
。我使用 print
语句对其进行了测试,但这将覆盖 onTap
的 VStack
并防止键盘在弹出后立即关闭。点击 VStack 上的任何其他地方仍然会关闭它,除了按钮。但如果需要,我可以随时向这些按钮添加 hideKeyboard
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。