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