読者です 読者をやめる 読者になる 読者になる

Lento con forza

大学生気分のIT系エンジニアが色々書いてく何か。ブログ名決めました。

Swiftでの引数有りSelector

最近はSwift書いたりPython書いたりしてます。
Scalaも書きたい。勉強だけはしてます。

結構つまらない所でしばらく引っかかったので書いておきます。

環境

Selectorで呼び出すメソッドに引数をつけるとrun-time error?

このようなコードで、キーボードの出現を取得しようとしましたが、ランタイムエラーになってしまいました。

    override func viewDidLoad() {
        super.viewDidLoad()
        
        NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWasShown"), name: UIKeyboardWillShowNotification, object: nil)
                

    }
    func keyboardWasShown(sender: NSNotification){
         doSomething();
    }

こんな感じのエラー。

libc++abi.dylib: terminating with uncaught exception of type NSException

原因がわからなくて、試しにSelectorの受け側の引数を以下のようになくすと何事も無く動きました。

    func keyboardWasShown(){
         doSomething();
    }

これで動かしてもよかったんですけど、今回はキーボードのサイズを取得したかったので、引数を取得できないのは都合悪いんですよね・・。

何が悪いんだろうな―ってずっと悩んでいたんですけど、Selectorの指定が悪かったようです。
以下のようにメソッド名の最後に":"をつけると正常に動きました。

    override func viewDidLoad() {
        super.viewDidLoad()
        
        NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWasShown:"), name: UIKeyboardWillShowNotification, object: nil)
                

    }
    func keyboardWasShown(sender: NSNotification){
         doSomething();
    }

重要なのは Selector("keyboardWasShown:") ここです。

この最後のコロンがないだけで動きませんでした。一文字に悩まされるのはいい気分じゃないですね。