SwiftUI 从 UITextField 中关闭键盘
Posted
技术标签:
【中文标题】SwiftUI 从 UITextField 中关闭键盘【英文标题】:SwiftUI Dismiss Keyboard from UITextField 【发布时间】:2021-06-07 19:06:03 【问题描述】:因此,出于我自己的原因,我需要 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
出于隐私原因,我不能提供所有代码,但这应该足以确定我的问题。
【问题讨论】:
【参考方案1】:我通过将这个函数添加到下面的视图中来做到这一点。
func hideKeyboard()
UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
然后使用 ontapGesture 可以让键盘消失。 例如,您可以在整个视图的背景堆栈上使用它。如果用户点击背景,键盘就会消失。
.onTapGesture
self.hideKeyboard()
【讨论】:
对,我试过了。但是然后点击 UITextField 会触发它,所以键盘永远不会发生【参考方案2】:于是我一夜之间自己发现了一个顿悟的窍门。
首先,我想与其他人分享一个非常基本的原因,说明 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
语句对其进行了测试,但这将覆盖VStack
的onTap
,并防止键盘在启动后立即被关闭。点击 VStack 上的任何其他位置仍然会关闭它,但按钮除外。但如果需要,我可以随时将hideKeyboard
添加到这些按钮中。
【讨论】:
以上是关于SwiftUI 从 UITextField 中关闭键盘的主要内容,如果未能解决你的问题,请参考以下文章
SwiftUI:在 macOS NavigationView 中关闭视图
如何在 SwiftUI 中关闭 ResearchKit 模态视图?