【问题标题】:Using NotifcationCenter in another class causes unrecognized selector in Swift在另一个类中使用 NotifcationCenter 会导致 Swift 中无法识别的选择器
【发布时间】:2020-05-20 21:36:58
【问题描述】:

我想创建另一个类并设置 NotificationCenter 以在键盘显示时进行视图。我试图将 UIViewController 作为参数。但是我发现了无法识别的选择器发送到实例的错误。为什么选择器无法识别,我该怎么办?

  • 视图控制器
   class ViewController: UIViewController {

     override func viewDidLoad() {
          bringFunc.upWithKeyboard(VC: self)
       }
   }
  • 自定义类
    class bringFunc {

        static  var view: UIView!
        static func upWithKeyboard(VC: UIViewController) {

            view = VC.view
            NotificationCenter.default.addObserver(VC, selector: #selector(keyboardWillShow), name:UIResponder.keyboardWillShowNotification, object: nil)

             NotificationCenter.default.addObserver(VC, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)

        }

        @objc func keyboardWillShow(notification: NSNotification){

            guard let rect = (notification.userInfo![UIResponder.keyboardFrameEndUserInfoKey]as? NSValue)?.cgRectValue, let duration = notification.userInfo![UIResponder.keyboardAnimationDurationUserInfoKey] as? TimeInterval else{return}

            UIView.animate(withDuration: duration) {
             let transform = CGAffineTransform(translationX: 0, y: -(rect.size.height/1.5))
                bringFunc.view.transform = transform

            }

         }

        @objc func keyboardWillHide(notification: NSNotification){
            guard let duration = notification.userInfo![UIResponder.keyboardAnimationDurationUserInfoKey] as? TimeInterval else{return}

            UIView.animate(withDuration: duration) {
                let transform = CGAffineTransform(translationX: 0, y: 0)
                bringFunc.view.transform = transform

            }
        }
    }

谢谢。

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    这里是固定变体(无论出于何种原因选择这种设计)

    class bringFunc {
    
            static  var view: UIView!
            class func upWithKeyboard(VC: UIViewController) {
    
                view = VC.view
                NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name:UIResponder.keyboardWillShowNotification, object: nil)
    
                 NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
    
            }
    
            @objc class func keyboardWillShow(notification: NSNotification){
    
                guard let rect = (notification.userInfo![UIResponder.keyboardFrameEndUserInfoKey]as? NSValue)?.cgRectValue, let duration = notification.userInfo![UIResponder.keyboardAnimationDurationUserInfoKey] as? TimeInterval else{return}
    
                UIView.animate(withDuration: duration) {
                 let transform = CGAffineTransform(translationX: 0, y: -(rect.size.height/1.5))
                    bringFunc.view.transform = transform
    
                }
    
             }
    
            @objc class func keyboardWillHide(notification: NSNotification){
                guard let duration = notification.userInfo![UIResponder.keyboardAnimationDurationUserInfoKey] as? TimeInterval else{return}
    
                UIView.animate(withDuration: duration) {
                    let transform = CGAffineTransform(translationX: 0, y: 0)
                    bringFunc.view.transform = transform
    
                }
            }
        }
    

    【讨论】:

    • 我想把这些函数放在一起以避免冗余代码。我打电话给upWithKeyboard() 制作实例,但它没有用......
    猜你喜欢
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 2013-03-31
    相关资源
    最近更新 更多