- 更新日: 2015年5月13日
- Swift & iOS
unrecognized selector sent to instance エラー
pull to refresh という画面を下方向にスワイプして表示データを更新させる機能を作っていたところ、Xcode でビルドした後にシミュレーターでアプリを実行したら以下のエラーが出ました。
1 2 3 |
unrecognized selector sent to instance xxxxx |
特にコンパイルエラーなどは発生せず、ビルド成功した後の実行時に発生しまして、何か特定のメソッドが存在しないよ〜というエラーらしい。以下エントリーなど参考。
unrecognized selector sent to instance : 週末プログラマの開発日記
— 環境 —
Swift 1.2
Xcode 6.3.1
unrecognized selector sent to instance xxxxx が発生したコード
以下の pull to refresh を実現するコードでエラーが発生した。
1 2 3 4 5 6 7 8 |
// pull to refresh let refreshControl = UIRefreshControl() refreshControl.addTarget(self, action: "onRefresh", forControlEvents: .ValueChanged) self.tableView.addSubview(refreshControl) func onRefresh(refreshControl: UIRefreshControl) { // ... } |
簡単に説明すると、refreshControl.addTarget に更新時のアクションである onRefresh を渡す。onRefresh は、更新時の処理を func として別途定義します。上記コードにミスが含まれるために、「unrecognized selector sent to instance xxxxx」が発生していた。
修正したコード
以下のように修正したら直りました。
1 2 3 4 |
// pull to refresh let refreshControl = UIRefreshControl() refreshControl.addTarget(self, action: "onRefresh:", forControlEvents: .ValueChanged) self.tableView.addSubview(refreshControl) |
違いが分かりますでしょうか..
修正箇所は、refreshControl.addTarget の第二引数(action:)の指定を onRefresh から onRefresh:(コロン付き)に変更した部分です。これで、表題の実行時エラー「unrecognized selector sent to instance xxxxx」が消えました。
どうやら refreshControl.addTarget に渡す action に引数がある場合は、refreshControl.addTarget で指定する action の名前に :(コロン)を付けないといけないらしいです。
iOS/swiftでselectorを使った際に引数なしのメソッドを指定しているにもかかわらず”:”をつけていて時間を取られたので備忘録 – Qiita
これは、自分みたいな Swift/iOS 初心者ははまる…。unrecognized selector sent to instance エラーが発生したら、メソッド名の指定でスペルミスがないかなどを調べれば解決できるかと思います。
- Swift & iOS の関連記事
- WKWebView/UIWebViewでウェブページが真っ白
- Unityのインストールと初期設定
- WKWebView/UIWebViewでNavigation Barの下にウェブページが隠れるのを回避
- SwiftでArray(配列)などをシャッフル
- Navigation Controllerで画面遷移させるSwiftコード
- Swiftでタップ/スワイプのイベント処理実装・UITapGestureRecognizerとUISwipeGestureRecognizer
- UIPageViewController画面下部のUIPageControlを非表示にする
- Swiftのバージョン確認・REPL実行
- Xcode7.0アップデートで遭遇した課題2つ
- 正規のXcodeかどうかチェック(XcodeGhostマルウェア騒動)
Leave Your Message!