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 语句对其进行了测试,但这将覆盖VStackonTap,并防止键盘在启动后立即被关闭。点击 VStack 上的任何其他位置仍然会关闭它,但按钮除外。但如果需要,我可以随时将hideKeyboard 添加到这些按钮中。

【讨论】:

以上是关于SwiftUI 从 UITextField 中关闭键盘的主要内容,如果未能解决你的问题,请参考以下文章

在 SwiftUI 中关闭 WKWebView

在 SwiftUI 中关闭按钮突出显示

SwiftUI:在 macOS NavigationView 中关闭视图

如何在 SwiftUI 中关闭 ResearchKit 模态视图?

SwiftUI 2 - 如何防止顶部部分在 macOS 和 iPadOS 的列表中关闭

从 uitableviewcell 内的文本字段中关闭 iPad 上的键盘