Search code examples
iosswiftnotificationsselectorobservers

How to create Selector with parameters from string


I am writing a program using Swift 3.1 and Xcode 8.3.3. I want to create a class, responsible for moving entire view when keyboard appears and disappears. But I faced difficulties with creating custom Selector with parameters from string. To show or hide keyboard we need function:

func keyboardWillShow(notification: Notification) {
//Code moving view when keyboard appears
}

I am trying to create a selector like this:

let selector = Selector(("keyboardWillShow")
NotificationCenter.default.addObserver(view, selector: selector, name: .UIKeyboardWillShow, object: anyView.view.window)

It is compiling, but when keyboard appears, it crashes. Because it is independent class I cannot use this construction:

#selector(keyboardWillShow)

Because it transforms Swift function to Objective-C function (adding @objc). So question is: how to create a Selector form with parameters string?

P. S. I can put the whole code there but I don't want question to be very big, so I will edit question if somebody asks...


Solution

  • Here is what you want, Selector with string type and Notification parameter argument

    Swift 4

    NotificationCenter.default.addObserver(self, selector: Selector(("showKeyboard:")), name:NSNotification.Name.UIKeyboardWillShow, object: nil)
    
    var keyboardHeight = 0.0
    //-------------------
    @objc func showKeyboard(_ sender: Notification) {
        keyboardWillShow(sender: sender as NSNotification, adjustHeight: 150)
        print("sender - \(sender)")
    }
    
    //-------------------
    func keyboardWillShow(sender: NSNotification, adjustHeight: CGFloat) {
        if let keyboardSize = (sender.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
            keyboardHeight = Double(keyboardSize.height)
            // do your calculations
        }
    }
    


    Swift 3

    NotificationCenter.default.addObserver(view, selector: Selector(("keyboardWillShow:")), name: .UIKeyboardWillShow, object: anyView.view.window)
    
    func keyboardWillShow(_ notification: Notification) { 
           keyboardWillShow(sender: sender as NSNotification, adjustHeight: 150)
            print("sender - \(sender)")
    
    } 
    



    Here are normal selector, according to language support
    Swift 4

    NotificationCenter.default.addObserver(self, selector: #selector(self.showKeyboard(sender:)), name:NSNotification.Name.UIKeyboardWillShow, object: nil)
    
    var keyboardHeight = 0.0
    
        //-------------------
        @objc func showKeyboard(sender: NSNotification) {
            keyboardWillShow(sender: sender, adjustHeight: 150)
        }
    
        //-------------------
        func keyboardWillShow(sender: NSNotification, adjustHeight: CGFloat) {
            if let keyboardSize = (sender.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
                keyboardHeight = Double(keyboardSize.height)
                // your operations here
            }
        }
    


    Swift 3

    NotificationCenter.default.addObserver(self, selector: #selector(self.showKeyboard(sender:)), name:NSNotification.Name.UIKeyboardWillShow, object: nil)
    
    var keyboardHeight = 0.0
    
        //-------------------
        func showKeyboard(sender: NSNotification) {
            keyboardWillShow(sender: sender, adjustHeight: 150)
        }
    
       //-------------------
        func keyboardWillShow(sender: NSNotification, adjustHeight: CGFloat) {
            if let keyboardSize = (sender.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
                keyboardHeight = Double(keyboardSize.height)
                // your operations here
            }
        }