How to write Keyboard notifications in Swift 3

前端 未结 10 1563
清歌不尽
清歌不尽 2020-12-08 10:37

I\'m trying to update this code to swift 3:

NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector(\"keyboardWillShow:\"), name: UIKeyboar         


        
相关标签:
10条回答
  • 2020-12-08 11:15

    Swift 4.2 Xcode 10 (10L213o)

    The main changes compared with Swift 3 are in the UIWindow.keyboardWillShowNotification and UIWindow.keyboardWillHideNotification

    let notifier = NotificationCenter.default
    notifier.addObserver(self,
                         selector: #selector(KeyboardLayoutConstraint.keyboardWillShowNotification(_:)),
                         name: UIWindow.keyboardWillShowNotification,
                         object: nil)
    notifier.addObserver(self,
                         selector: #selector(KeyboardLayoutConstraint.keyboardWillHideNotification(_:)),
                         name: UIWindow.keyboardWillHideNotification,
                         object: nil)
    
    
    @objc
    func keyboardWillShowNotification(_ notification: NSNotification) {}
    
    @objc
    func keyboardWillHideNotification(_ notification: NSNotification) {}
    
    0 讨论(0)
  • 2020-12-08 11:16

    Swift 4

    override func viewDidLoad() {
        super.viewDidLoad()   
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: .UIKeyboardWillShow, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
    }
    
    func keyboardWillShow(notification: NSNotification) {
         print("keyboardWillShow")
    }
    
    func keyboardWillHide(notification: NSNotification){
         print("keyboardWillHide")
    }
    
    deinit {
         NotificationCenter.default.removeObserver(self)
    }
    

    You can also get keyboard info using below code inside these methods.

    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChange), name: .UIKeyboardWillChangeFrame, object: nil) .      
    
    @objc func keyboardWillChange(notification: NSNotification) {
         let duration = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey] as! Double
         let curve = notification.userInfo![UIKeyboardAnimationCurveUserInfoKey] as! UInt
         let curFrame = (notification.userInfo![UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
         let targetFrame = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
         let deltaY = targetFrame.origin.y - curFrame.origin.y
     }
    
    0 讨论(0)
  • 2020-12-08 11:18

    You can replace the deprecated string literal Selector with the type-checked #selector(Class.method) pair:

    let center = NotificationCenter.default
    center.addObserver(self,
                       selector: #selector(keyboardWillShow(_:)),
                       name: .UIKeyboardWillShow,
                       object: nil)
    
    center.addObserver(self,
                       selector: #selector(keyboardWillHide(_:)),
                       name: .UIKeyboardWillHide,
                       object: nil)
    

    The #selector syntax is much safer, since Swift is able to check at compile time that the specified method actually exists.

    For more information about Swift selectors, see rickster's detailed answer.

    0 讨论(0)
  • 2020-12-08 11:18

    Here is the best solution that works for me as far (used from "Lets Build That App" YouTube channel)

    class ChatVC: UIViewController, UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate {
    
    // reference to your UIView with message TextField
    
        @IBOutlet weak var ChatView: UIView!   
    
    
    // bottom constrain to your UIView (in my case ChatView)
    
        var bottomConstraint: NSLayoutConstraint?  
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
    // add some text in the placeholder if you want
    
            messageField.placeholder = "Type your message.." 
    
    // here we add two notifications for showing and hiding the keyboard
    
            NotificationCenter.default.addObserver(self, selector: #selector(handleKeyboardNotification), name: UIResponder.keyboardWillShowNotification, object: nil)
    
            NotificationCenter.default.addObserver(self, selector: #selector(handleKeyboardNotification), name: UIResponder.keyboardWillHideNotification, object: nil)
    
    
    // defines the start position for message textField that will be shown on the screen
    
            bottomConstraint = NSLayoutConstraint(item: ChatViewField!, attribute: .bottom, relatedBy: .equal, toItem: view, attribute: .bottom, multiplier: 1, constant: -40)    
            view.addConstraint(bottomConstraint!)    
        }
    
    // handles notifications for both cases when keyboard pops up and disappears  
    
      @objc func handleKeyboardNotification(notification: NSNotification){
            if let userInfo = notification.userInfo {
    
                let keyboardFrame =  (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
                print(keyboardFrame)
    
                let isKeyboardShowing = notification.name == UIResponder.keyboardWillShowNotification
    
                bottomConstraint?.constant = isKeyboardShowing ? -keyboardFrame.height : -40
    
    // makes animation at the same time as the keyboard
    
    UIView.animate(withDuration: 0, delay: 0, options: UIView.AnimationOptions.curveEaseOut, animations: {
    
                    self.view.layoutIfNeeded()
                }) { (completed) in    
                }   
            }
        }
    
    0 讨论(0)
  • 2020-12-08 11:19

    I fixed this issue by writing the code like this

    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: .UIKeyboardWillShow, object: nil)
    
    0 讨论(0)
  • 2020-12-08 11:20

    In Swift 3.0

     override func viewDidLoad()
        {
            super.viewDidLoad()
     NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
            NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
    
    }
    

    Keybord Show and Hide

    func keyboardWillShow(notification: NSNotification) 
    {
    
          // Your Code Here
    }
    
    func keyboardWillHide(notification: NSNotification)
    {  
       //Your Code Here     
    }
    
    0 讨论(0)
提交回复
热议问题