2010年4月22日木曜日

InterfaceBuilderでIBActionが認識されない場合の対処

理由はわからない。しかし、カスタムのViewControllerのヘッダーで定義したはずのIBActionがInterfaceBuilder(以下IB)で認識されなくなる場合がある。ただ、ヘッダーで定義したIBOutletは認識される。

IBの「File」>「Reload All Class Files」を使っても状況は変わらない。

放っておいてそのままコンパイルすると「・・・no longer defined・・・」という警告が出る。困ったもんだ。見たところ特に動作に影響は無いようだが、警告が出ている以上どこでどうなるかわからない。

そこで、この警告を出さないようにするにはどうすればよいか?

・カスタムViewControllerのXIBをIBで開く
・ライブブラリを開く
・「Classes」タブへ
・カスタムViewCOntrollerのクラスを探して選択
・下に出てくる詳細で「Actions」タブへ
・「+」ボタンでアクションに設定したいメソッド名を入力 例「onTouchUpInsideBtn:」
・インスペクタを開く
・「File's Owner」を選択
・インスペクタの「connections」タブへ
・「Recieved Actions」で「!」のついているアクションを切り離す
・さっきIBで追加したアクションが「Recieved Actions」に出てくるので適当にアウトレットと接続する
・保存する

IBで追加したアクションはデフォルトではidを引数にもつように設定されるので、もしヘッダーの方で定義してあるメソッドがidを引数に持つようになっていない場合は持たせる。

例:- (IBAction)onTouchUpInsideBtn:(id)sender;


前にも一度このような状況になったが、その時は大したプログラムではなかったのでイチから作り直した。しかし、今回はそうはいかなかった。一応これで対処方法は判ったが、面倒だ。一体どこでどうしたらこうなったのか・・・?