📅  最后修改于: 2023-12-03 14:52:07.551000             🧑  作者: Mango
在 SwiftUI 中关闭键盘可以通过以下几种方式实现:
可以调用 .resignFirstResponder()
来关闭当前 Text Field 的键盘。在需要关闭键盘的地方添加以下代码:
UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to:nil, from:nil, for:nil)
注意:该方法会关闭所有处于编辑状态的 Text Field,因此需要在需要关闭所有键盘的情况下使用。
在 SwiftUI 中可以使用 UITextField
并实现 UITextFieldDelegate
,从而在完成输入后关闭键盘。例如:
struct ContentView: View {
@State private var text: String = ""
var body: some View {
TextField("请输入...", text: $text)
.textFieldStyle(RoundedBorderTextFieldStyle())
.padding()
.keyboardType(.default)
.returnKeyType(.done)
.onSubmit {
hideKeyboard()
}
}
func hideKeyboard() {
UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to:nil, from:nil, for:nil)
}
}
extension View {
func onSubmit(perform action: @escaping () -> Void) -> some View {
return self.background(
KeyboardObserver(action: action)
)
}
}
struct KeyboardObserver: UIViewRepresentable {
let action: () -> Void
func makeUIView(context: UIViewRepresentableContext<KeyboardObserver>) -> UIView {
let view = UIView(frame: .zero)
let tapGesture = UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing))
view.addGestureRecognizer(tapGesture)
return view
}
func updateUIView(_ uiView: UIView, context: UIViewRepresentableContext<KeyboardObserver>) {
}
func makeCoordinator() -> Coordinator {
Coordinator(action: action)
}
class Coordinator {
let action: () -> Void
init(action: @escaping () -> Void) {
self.action = action
}
@objc func keyboardWillHide(notification: Notification) {
action()
}
}
}
IQKeyboardManagerSwift 是一个很好的开源库,提供了很多有用的功能,比如控制键盘出现隐藏的动画、处理键盘遮挡输入框等等。
首先安装 IQKeyboardManagerSwift,可以通过 CocoaPods 或手动安装,具体请参考 官方文档。
然后在 AppDelegate.swift
中启动 IQKeyboardManagerSwift:
import IQKeyboardManagerSwift
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
IQKeyboardManager.shared.enable = true
IQKeyboardManager.shared.enableAutoToolbar = false
return true
}
}
启用后就不需要做任何其他配置了,库会自动处理键盘事件。
以上三种方法都可以成功关闭键盘,选择适合自己的方法即可。