あれ?故障かな?
なかなか珍しい現象ですが何回か陥ったので、備忘録として残しておきます。
XcodeのInterface BuilderはiOS開発者にとってかかせないものとなっていますが、
ViewやButtonをIBOutlet/IBActionでコードに紐付けるというありふれたユースケースにて、
ちゃんと紐付いてるのに実行するとエラーで落ちる!?あれ?なんで・・・?ということが起きました。
そう、エラーの正体は単純明快、稀によく見るこいつです(笑)
“Unrecognized Selector Sent to Instance”
ちゃんと実装しているはずなのに動かないエラーほどフラストレーションのたまるものはありません
解決策
- Interface Builderを開いて、親のViewを選択した状態でXcode右ペインのUtilitiesの一番右、
Connections Inspectorを開きます - 一旦、何も考えずに動作しないconnectionをすべて消します
- 同時に該当するクラスのコードの動作しないIBOutlet/IBActionもすべて消します
- 真ん中のペインをAssistant Editorに変えて、Interface BuilderとCode Editorが見れる状態にします
- 先ほど消したconnectionをIB上からCtrlを押しながらコードへ一つ一つ紐づけ直します
(propertyやmethodはもう一度入力し直してください、ここが重要です) - 実行しましょう
- 晴れて解決するはずです
考えられる原因
今思うと、ファイルの名前を別のクラスに変えてOutletを紐付けようとしたことが悪かった気がします。
ぽちぽちドラッグだけで紐づけを行っていました。が、何度正確にやり直してもダメでした。
このような現象に陥らないためにも、ファイルは新規作成してやるように心がけたいと思います。
とはいえ、Xcodeのバグのような気もしますので今後起きなくなることを願ってます。
開発環境
最後になりますが、参考に開発環境を記しておきます。
- Xcode 8.0
- Swift 2.3
(ちなみにXcode7, Objective-C 2.0の時も起こりました)
参考
IBAction Button “Unrecognized Selector Sent to Instance” Error - StackOverflow