SwiftUI 从 UITextField 关闭键盘

SwiftUI Dismiss Keyboard from UITextField

因此,出于我自己的原因,我需要 UITextField 及其代表通常会提供的完全控制,但它被添加到的屏幕是用 SwiftUI 编写的。需要 .decimal 键盘,所以没有 Return 键。

我只剩下 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 可以让键盘消失。 例如,您可以在整个视图的背景 Stack 上使用它。如果用户点击背景,键盘将消失。

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