最近は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:")
ここです。
この最後のコロンがないだけで動きませんでした。一文字に悩まされるのはいい気分じゃないですね。