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が動かないよりはマシということで試しました。
ところが…!!
あぁ、今日はリンカさん不機嫌だなぁと思いつつClean&Buildしましたが状況は変わらず、Xcode再起動しても同じでした。
これはソースファイルがコンパイルされていない可能性が高い!と判断して、ビルドの設定を確認してみると…
赤枠で囲った場所にあるコンパイル対象のソースファイルに、目的のクラスのソースが含まれていませんでした。ここにソースファイルを追加することで、今回の問題は全て解決しました。
もちろん、前述のStackOverflowで紹介されていた解決策の気持ち悪いコードも不要です。
思い返せば、このクラスは別のプロジェクトからドラッグ&ドロップでコピーしてきたものであり、Xcodeの新規クラス作成の手続きを踏んでいませんでした。こういったクラス追加時の作業の際はコンパイル対象にも追加されたのかどうか、ちょっと意識しておきたいところですね。
検証環境
- MacBook Pro (Early 2011)
- MacOS X 10.7.3
- Xcode 4.3.2