Swift 无法识别的选择器发送到实例,通知中心获取键盘大小

Swift 无法识别的选择器发送到实例,通知中心获取键盘大小,swift,swift4,notificationcenter,Swift,Swift4,Notificationcenter,如果我尝试点击我的文本字段,我会得到一个错误,与试图获取移动ios设备上键盘大小的这几行代码有关。通知中心的代码行位于覆盖的viewdide中 NotificationCenter.default.addObserver(self, selector: Selector(("keyboardWillShow:")), name: UIResponder.keyboardDidShowNotification, object: nil) NotificationCenter.default.

如果我尝试点击我的文本字段,我会得到一个错误,与试图获取移动ios设备上键盘大小的这几行代码有关。通知中心的代码行位于覆盖的
viewdide

 NotificationCenter.default.addObserver(self, selector: Selector(("keyboardWillShow:")), name: UIResponder.keyboardDidShowNotification, object: nil)

 NotificationCenter.default.addObserver(self, selector: Selector(("keyboardWillHide:")), name: UIResponder.keyboardDidHideNotification, object: nil)

func keyboardWillShow(notification: NSNotification) {
    if let userInfo = notification.userInfo {
        if let keyboardSize = (userInfo[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
            self.bottomConstraint.constant = keyboardSize.height
        }
    }
}

func keyboardWillHide(notification: NSNotification) {
    self.bottomConstraint.constant = 0

}
使用如下代码

NotificationCenter.default.addObserver(self,
                                       selector: #selector(keyboardWillShow(notification:)),
                                       name: UIResponder.keyboardWillShowNotification,
                                       object: nil)
NotificationCenter.default.addObserver(self,
                                       selector: #selector(keyboardWillHide(notification:)),
                                       name: UIResponder.keyboardWillHideNotification,
                                       object: nil)

@objc func keyboardWillShow(notification: NSNotification) {
if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
      // Your code
  }
}

@objc func keyboardWillHide(notification: NSNotification) {
     // Your code
}
如果您对plz评论有任何疑问,希望这能起作用。

请尝试以下代码:

override func viewDidLoad() {
    super.viewDidLoad()
    NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)

}

@objc func keyboardWillShow(notification: Notification) {
    if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
        print("notification: Keyboard will show")
    }

}

@objc func keyboardWillHide(notification: Notification) {
    if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {

    }
}
您可以尝试以下方法:

viewDidLoad()
中的此代码:

然后将其添加到
ViewController

@objc func keyboardWillShow(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
         print("Keyboard opened \(keyboardSize)")
    }
}

@objc func keyboardWillHide(notification: NSNotification) {
    print("Keyboard hide")
}

希望这会有所帮助。

您应该注销在视图中注册的任何通知

func registerForKeyboardNotifications()
 {
      //Adding notifies on keyboard appearing
      NotificationCenter.default.addObserver(self, selector: #selector(keyboardWasShown(_:)), name: UIResponder.keyboardWillShowNotification, object: nil)
      NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillBeHidden(_:)), name: UIResponder.keyboardWillHideNotification, object: nil)
 }


 func deRegisterFromKeyboardNotifications()
 {
       //Removing notifies on keyboard appearing
       NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil)
       NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil)
 }

 @objc func keyboardWasShown(_ notification: NSNotification)
 { 
     //todo
 }

 @objc func keyboardWillBeHidden(_ notification: NSNotification)
 { 
      //todo
 }

 override func viewDidLoad() {
     super.viewDidLoad()
     registerForKeyboardNotifications()
}

override func viewDidDisappear(_ animated: Bool) {
     super.viewDidDisappear(animated)
     deRegisterFromKeyboardNotifications()
}

出现此错误是因为通知参数。对于当前签名,您应使用:


#selector(keyboardWillShow(notification:))
#selector(keyboardWillHide(notification:))

或者以这种方式重写您的方法:


@objc func keyboardWillShow(_ notification: Notification) {
    // Code
}

@objc func keyboardWillHide(_ notification: Notification) {
    // Code
}

并使用下一个语法:


#selector(keyboardWillShow(_:))
#selector(keyboardWillHide(_:))

编辑:

您还可以使用简化语法:


#selector(keyboardWillShow)
#selector(keyboardWillHide)


使用类型安全语法

#selector(keyboardWillShow)


但是,我强烈建议使用现代的基于闭包的语法

NotificationCenter.default.addObserver(forName: UIResponder.keyboardWillShowNotification, object: nil, queue: .main) { [weak self] notification in
    if let userInfo = notification.userInfo,
       let keyboardSize = (userInfo[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
            self?.bottomConstraint.constant = keyboardSize.height
    }
}
NotificationCenter.default.addObserver(forName: UIResponder.keyboardWillHideNotification, object: nil, queue: .main) { [weak self] _ in
    self?.bottomConstraint.constant = 0
}

即使是
#选择器(键盘将显示)
也是有效的。非常感谢大家。
@objc func keyboardWillShow(_ notification: Notification) { ...
NotificationCenter.default.addObserver(forName: UIResponder.keyboardWillShowNotification, object: nil, queue: .main) { [weak self] notification in
    if let userInfo = notification.userInfo,
       let keyboardSize = (userInfo[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
            self?.bottomConstraint.constant = keyboardSize.height
    }
}
NotificationCenter.default.addObserver(forName: UIResponder.keyboardWillHideNotification, object: nil, queue: .main) { [weak self] _ in
    self?.bottomConstraint.constant = 0
}