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

職業プログラマの休日出勤

職業プログラマによる日曜自宅プログラミングや思考実験の成果たち。リアル休日出勤が発生すると更新が滞りがちになる。記事の内容は個人の意見であり、所属している(いた)組織の意見ではない。

Unknown class MyClass in Interface Builder file

iOSの開発中に、サブクラス化によって拡張したUI部品をStoryBoardsに適用しようとしたところ、表題のエラーに遭遇しました。エラーとは言ってもappがクラッシュする訳ではなく、実行時にログが出力されるのと、標準のUI部品が利用されてしまう、という状況に陥っただけですが。

調べてみると事例は多くあるようで、最も参考になる情報はStackOverflowの cocoa - "Unknown class <MyClass> in Interface Builder file" error at runtime - Stack Overflow でしょうか。解決策としてはmain関数やApplicationDelegateの初期化処理時などに

[MyClass class];

などを実行してあげることで強制的にクラスをロードしてあげる、というものが挙げられています。なんだかJavaのJDBCドライバのロード操作

Class.forName("HogehogeDriver");

を連想させる気持ち悪いコードではありますが、appが動かないよりはマシということで試しました。

ところが…!!

今度はビルド時のエラーになってしまいました。
f:id:t_motooka:20120412100039p:image
f:id:t_motooka:20120412100040p:image

あぁ、今日はリンカさん不機嫌だなぁと思いつつClean&Buildしましたが状況は変わらず、Xcode再起動しても同じでした。

これはソースファイルがコンパイルされていない可能性が高い!と判断して、ビルドの設定を確認してみると…
f:id:t_motooka:20120412100041p:image
赤枠で囲った場所にあるコンパイル対象のソースファイルに、目的のクラスのソースが含まれていませんでした。ここにソースファイルを追加することで、今回の問題は全て解決しました。
もちろん、前述のStackOverflowで紹介されていた解決策の気持ち悪いコードも不要です。

思い返せば、このクラスは別のプロジェクトからドラッグ&ドロップでコピーしてきたものであり、Xcodeの新規クラス作成の手続きを踏んでいませんでした。こういったクラス追加時の作業の際はコンパイル対象にも追加されたのかどうか、ちょっと意識しておきたいところですね。

検証環境