PC パソコン

Xcode『Unknown class in Interface Builder file』の解決方法

Xcodeでアプリを起動したとき、コンソールに Unknown class … in Interface Builder file と表示されることがあります。これはStoryboardやXIBに保存されているCustom Classの情報と、実際にビルドされたSwift / Objective-Cクラスが一致していないときに発生する代表的なInterface Builderエラーです。

画面が表示されない、IBOutletがnilになる、起動直後にクラッシュするといった症状につながることもあります。本記事では、原因の切り分けからCustom Class、Module、Target Membership、クラス名変更後の残存設定まで順番に確認します。

エラーメッセージの意味

Unknown class MyViewController in Interface Builder file.

StoryboardやXIBには、配置したView ControllerやViewに割り当てたCustom Class名がXMLとして保存されています。実行時にUIKitがそのクラスを読み込もうとしても、アプリ内に該当クラスが存在しない、またはモジュール名が違うと、この警告が出ます。

主な原因

  • Identity InspectorのCustom Classに古いクラス名が残っている
  • クラス名を変更したがStoryboard / XIB側を変更していない
  • Moduleが誤っている、または別ターゲットのModuleを参照している
  • SwiftファイルのTarget Membershipが外れており、そのターゲットにクラスが含まれていない
  • クラスを削除したのにStoryboard側の設定だけ残っている
  • StoryboardやXIBをコピーした際、元プロジェクトのModule名が残っている
  • ビルドキャッシュに古いInterface Builder情報が残っている

代表的な発生状況

特に多いのは、ViewController.swiftの名前を変更した直後、別プロジェクトからStoryboardをコピーした直後、アプリターゲットを追加した直後です。また、Gitのブランチ切り替え後にStoryboardとSwiftファイルの状態がずれた場合にも発生します。

確認手順

1. エラーに表示されたクラス名を確認する

まずコンソールの Unknown class ... に表示されている名前を控えます。たとえば次の例なら確認対象は MyViewController です。

Unknown class MyViewController in Interface Builder file.

2. Storyboard / XIBのCustom Classを確認する

対象のStoryboardまたはXIBを開き、該当するView ControllerやViewを選択します。右側の Identity Inspector を開き、Custom Classの Class が実際のSwiftクラス名と一致しているか確認します。

3. Moduleを確認する

同じIdentity Inspector内の Module を確認します。通常は現在のアプリターゲットのモジュール、または Current Product Module を使います。別プロジェクトからコピーしたStoryboardでは、古いModule名が残っていることがあります。

4. Target Membershipを確認する

該当するSwiftファイルを選択し、File Inspectorの Target Membership で実行するアプリターゲットにチェックが入っているか確認します。チェックがないとファイルがコンパイル対象に入らず、Storyboardからクラスを見つけられません。

解決方法1:Custom Classを正しい名前に修正する

クラス名を変更した場合は、Storyboard / XIB側のCustom Classも同じ名前に変更します。

final class SettingsViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() } }

この場合、Identity InspectorのClassも SettingsViewController にします。古い MyViewController が残っていれば削除または置き換えます。

解決方法2:ModuleをCurrent Product Moduleにする

Swiftクラスが同じアプリターゲットにある場合は、Identity InspectorでModuleを正しいターゲットへ変更します。迷う場合は、Xcodeが選択可能な Current Product Module を使用するのが安全です。

注意:Frameworkや別ターゲット内のクラスを使っている場合は、Current Product Moduleではなく、そのクラスを含む正しいModuleを指定する必要があります。

解決方法3:Target Membershipを有効にする

Swiftファイル自体は存在していても、ビルド対象ターゲットに含まれていないと実行時に見つかりません。File Inspectorで対象ターゲットにチェックを入れたあと、再ビルドします。

ビルド設定の確認には次のコマンドも利用できます。

xcodebuild -project MyApp.xcodeproj -scheme MyApp -showBuildSettings

解決方法4:不要なCustom Class設定を削除する

以前はカスタムクラスを使っていたものの、現在は標準の UIViewController や UIView に戻した場合、Storyboard側に古いClass名だけ残ることがあります。Identity InspectorのCustom Classを空欄に戻すか、正しい標準クラスへ戻してください。

解決方法5:Storyboard / XIBのXMLに古いクラス名が残っていないか確認する

Xcode上で見つけにくい場合は、StoryboardやXIBを Open As > Source Code で開いて検索します。

<viewController customClass="MyViewController" customModule="OldApp">

customClass や customModule に古い値が残っていれば、Interface Builderで正しい設定に戻します。XMLを直接編集する場合は、構造を壊さないよう十分注意してください。

解決方法6:Clean Build FolderとDerivedDataを整理する

設定を直しても同じ警告が残る場合は、古いビルド成果物を削除します。Xcodeで Product > Clean Build Folder を実行してから再ビルドしてください。

必要であればDerivedDataも削除します。

rm -rf ~/Library/Developer/Xcode/DerivedData/*

DerivedDataの全削除は他プロジェクトのビルドキャッシュも消します。複数案件を同時に開発している場合は、対象プロジェクトのフォルダだけ削除する方法もあります。

解決方法7:Objective-Cクラスの場合を確認する

Objective-CのクラスをStoryboardから利用する場合も、クラスがターゲットへ正しくリンクされている必要があります。SwiftとObjective-Cを混在させているプロジェクトでは、ファイルのTarget Membershipやモジュール構成も確認してください。

それでも直らない場合

次の順番で再確認すると切り分けしやすくなります。

  1. コンソールに表示されたクラス名とSwift / Objective-Cの実クラス名を比較
  2. Storyboard / XIBのIdentity InspectorでClassを確認
  3. Moduleを確認
  4. SwiftファイルのTarget Membershipを確認
  5. Storyboard / XIBをSource Codeで検索
  6. Clean Build Folder、必要ならDerivedData削除

注意点

Unknown class はコンパイルエラーではなく、実行時にInterface Builderのアーカイブを復元する段階で見つかることがあります。そのため「ビルドは成功するのに画面表示時だけ警告やクラッシュが起きる」という状態になり得ます。

また、同じクラス名が複数ターゲットに存在するプロジェクトでは、単にClass名だけでなくModuleまで必ず確認してください。

まとめ

Xcodeの Unknown class in Interface Builder file は、Storyboard / XIBに保存されたCustom Class情報と実際のビルド成果物が一致していないことが主な原因です。最初にIdentity InspectorのClassとModuleを確認し、次にTarget Membership、古いXML参照、ビルドキャッシュの順で調べると効率よく解決できます。

クラス名変更やStoryboardのコピー後に発生した場合は、古いCustom ClassまたはModule名が残っていないかを最優先で確認してください。