Swift > 4.++
您可以使用协议和协议扩展。让我们创建KeyboardListener协议。
protocol KeyboardListener: class {
func registerKeyboardObserver()
func keyboardDidUpdate(keyboardHeight: CGFloat)
func removeObserver()
}
然后在UIViewController扩展中创建@objc函数
extension UIViewController {
@objc func adjustForKeyboard(notification: Notification) {
guard let keyboardValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else { return }
let keyboardScreenEndFrame = keyboardValue.cgRectValue
let keyboardViewEndFrame = view.convert(keyboardScreenEndFrame, from: view.window)
if notification.name == UIResponder.keyboardWillHideNotification {
if let keyboardLister = self as? KeyboardListener {
keyboardLister.keyboardDidUpdate(keyboardHeight: .zero)
}
} else {
if let keyboardLister = self as? KeyboardListener {
keyboardLister.keyboardDidUpdate(keyboardHeight: keyboardViewEndFrame.height - view.safeAreaInsets.bottom)
}
}
}
}
然后,使用键盘监听器扩展来实现默认功能。
extension KeyboardListener where Self: UIViewController {
func registerKeyboardObserver() {
let notificationCenter = NotificationCenter.default
notificationCenter.addObserver(self, selector: #selector(adjustForKeyboard), name: UIResponder.keyboardWillHideNotification, object: nil)
notificationCenter.addObserver(self, selector: #selector(adjustForKeyboard), name: UIResponder.keyboardWillChangeFrameNotification, object: nil)
}
func removeObserver() {
NotificationCenter.default.removeObserver(self)
}
}
最后,我们可以从我们的ViewController类中使用它。
extension EditProfileVC: KeyboardListener {
func keyboardDidUpdate(keyboardHeight: CGFloat) {
//update view when keyboard appear,
}
}
在viewWillAppear中调用register方法,而在deinit中移除观察者。
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
registerKeyboardObserver()
}
deinit {
removeObserver()
}
#selector(ViewController.keyBoardUp(notification:))
,并将函数更改为func keyBoardUp(notification: Notification){ print("HELLO") }
。 - Nirav D