我正在尝试为uiview功能制作一个方便的Binding键盘。我无法克服这个错误
***由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [Twitter.LoginVC handleKeyboard:]:无法识别的选择器发送到实例0x7ffbf142e970'
class KeyboardService {
var constraint: NSLayoutConstraint!
var vc: UIViewController!
func bind(bottomConstraint: NSLayoutConstraint, vc: UIViewController) {
constraint = bottomConstraint
self.vc = vc
NotificationService.instance.addKeyboardObservers(onVC: vc, handleKeyboardSelector: #selector(self.handleKeyboard(_:))) // **CRASHES HERE**
}
@objc func handleKeyboard(_ notification: NSNotification) {
NotificationService.instance.handleKeyboard(notification: notification, bottomConstraint: constraint, vc: vc)
}
}
这是我的notificationService:
class NotificationService {
static let instance = NotificationService()
func addKeyboardObservers(onVC vc: UIViewController, handleKeyboardSelector: Selector) {
NotificationCenter.default.addObserver(vc, selector: handleKeyboardSelector, name: UIResponder.keyboardWillShowNotification, object: nil)
NotificationCenter.default.addObserver(vc, selector: handleKeyboardSelector, name: UIResponder.keyboardWillHideNotification, object: nil)
}
}
编辑:
class KeyboardService {
var constraint: NSLayoutConstraint!
var vc: UIViewController!
func bind(bottomConstraint: NSLayoutConstraint, vc: UIViewController) {
constraint = bottomConstraint
self.vc = vc
NotificationService.instance.addKeyboardObservers(self, handleKeyboardSelector: #selector(self.handleKeyboard(_:)))
}
@objc func handleKeyboard(_ notification: NSNotification) {
NotificationService.instance.handleKeyboard(notification: notification, bottomConstraint: constraint, vc: vc)
}
}
编辑2:
class KeyboardService {
var constraint: NSLayoutConstraint!
var vc: UIViewController!
func bind(bottomConstraint: NSLayoutConstraint, vc: UIViewController) {
constraint = bottomConstraint
self.vc = vc
NotificationService.instance.addKeyboardObservers(self, handleKeyboardSelector: #selector(handleKeyboard(_:)))
}
@objc func handleKeyboard(_ notification: NSNotification) {
NotificationService.instance.handleKeyboard(notification: notification, bottomConstraint: constraint, vc: vc)
}
}
在vc的viewDidLoad()中:
KeyboardService().bind(bottomConstraint: loginBtnBackViewBottomConstraint, vc: self)
您正在尝试将选择器发送到vc
;但它是一个UIViewController
实际上没有一个叫做handleKeyboard(_:)
的方法。您应该更改为您的注册方法:
func addKeyboardObservers(_ observer: Any, handleKeyboardSelector: Selector) {
NotificationCenter.default.addObserver(observer, selector: handleKeyboardSelector, name: UIResponder.keyboardWillShowNotification, object: nil)
NotificationCenter.default.addObserver(observer, selector: handleKeyboardSelector, name: UIResponder.keyboardWillHideNotification, object: nil)
}
然后当你使用它时,你会做:
NotificationService.instance.addKeyboardObservers(self, handleKeyboardSelector: #selector(self.handleKeyboard(_:)))
你可以看到你现在告诉你在self
上触发选择器,因为它实际上是self
有这种方法。作为一般规则:将选择器发送到实例,因此该实例必须具有所选方法。
如果你真的想将选择器发送到viewController
实例,你可以创建一个extension
,将方法添加到每个UIViewController
extension UIViewController {
@objc func handleKeyboard(_ notification: NSNotification) {
// do your stuff here
}
}
然后,在注册时做:
NotificationService.instance.addKeyboardObservers(onVC: vc, handleKeyboardSelector: #selector(vc.handleKeyboard(_:))) // notice the vc.handleKeyboard instead of self.handleKeyboard
编辑尝试在视图控制器中保留键盘服务:
let keyboardService = KeyboardService()
override func viewDidLoad() {
super.viewDidLoad()
keyboardService.bind(bottomConstraint: loginBtnBackViewBottomConstraint, vc: self)
}