XcodeでStoryboardやXIBを含むiOSアプリをビルドした際に、Command CompileStoryboard failed with a nonzero exit code や CompileStoryboard failed と表示されてビルドが止まることがあります。このエラーは、Storyboard内の設定不整合、存在しないクラスやモジュールの参照、壊れたOutlet・Action、対応していないDeployment Target、Interface Builderのキャッシュ不整合などが原因で発生します。ここでは原因の切り分け方と代表的な解決方法を順番に確認します。
主な原因
- Storyboard上で指定したCustom Classが存在しない、またはModule設定が誤っている
- 削除・名前変更したIBOutletやIBActionへの接続がStoryboard側に残っている
- Storyboard内で使用しているUI要素や属性がDeployment Targetと合っていない
- StoryboardやXIBのXMLが競合解消などで破損している
- XcodeのDerivedDataやInterface Builder関連キャッシュが不整合を起こしている
- 複数ターゲットでTarget MembershipやModule設定が食い違っている
代表的な発生状況
ビルドログでは、次のような形で表示されます。
Command CompileStoryboard failed with a nonzero exit code
この1行だけでは原因を特定できないため、直前に表示されているInterface Builderの詳細エラーを確認することが重要です。
確認手順
- XcodeのIssue Navigatorを開き、CompileStoryboardエラーを展開する
- ビルドログでCompileStoryboardの直前にある詳細メッセージを確認する
- 問題が示されているStoryboardまたはXIBをInterface Builderで開く
- Custom Class、Module、Outlet、Action、Target Membershipを確認する
- StoryboardをXML表示して、壊れた参照や競合マーカーがないか確認する
解決方法1:Custom ClassとModuleを確認する
Storyboard上のView ControllerやViewに設定されているCustom Classが、実際のSwiftまたはObjective-Cクラスと一致しているか確認します。
Identity InspectorでClass名、Module、Inherit Module From Targetの設定を確認してください。クラス名を変更したあとにStoryboard側だけ古い名前が残っていると、CompileStoryboardで失敗することがあります。
解決方法2:壊れたIBOutlet・IBAction接続を削除する
削除したプロパティやメソッドへの接続がStoryboardに残っている場合は、Connections Inspectorから不要な接続を外し、必要な接続を張り直します。
@IBOutlet weak var titleLabel: UILabel!
@IBAction func didTapButton(_ sender: UIButton) {
// action
}
解決方法3:StoryboardをXMLとして確認する
Source Controlの競合解消後などにStoryboardのXMLが壊れている場合があります。Storyboardを右クリックし、Open As → Source Codeで内容を確認します。
Gitの競合マーカーや不完全なXMLが残っていないか確認し、見つかった場合は正しく修正してからInterface Builderで再度開きます。
解決方法4:Deployment Targetを確認する
Storyboard内で使用している機能が、設定しているiOS Deployment Targetより新しいOSを必要としている場合があります。プロジェクトとターゲットのDeployment Targetを確認し、StoryboardのFile InspectorにあるDeployment設定とも整合させます。
解決方法5:DerivedDataをクリアする
Storyboard自体に問題が見つからない場合は、Xcodeのキャッシュ不整合を疑います。XcodeのSettingsからLocationsを開き、Derived Dataの保存場所を表示して対象プロジェクトのDerivedDataを削除するか、Product → Clean Build Folderを実行してから再ビルドします。
xcodebuild -alltargets clean
解決方法6:ibtoolで詳細を確認する
StoryboardのコンパイルにはAppleのibtoolが使用されます。必要に応じてターミナルからファイル情報を確認できます。
xcrun ibtool --warnings --errors --notices Base.lproj/Main.storyboard
Storyboardのパスはプロジェクト構成に合わせて変更してください。
解決方法7:Target Membershipを確認する
複数ターゲットを持つプロジェクトでは、Storyboardが意図したターゲットに含まれているかをFile Inspectorで確認します。不要なターゲットに含まれていることで、そのターゲットでは存在しないクラスやModuleを参照し、コンパイルに失敗する場合があります。
注意点
Command CompileStoryboard failed with a nonzero exit code は最終的な失敗通知であり、根本原因そのものではないことが多いです。まずこの行より前に表示される具体的なInterface Builderエラーを探してください。キャッシュのクリアだけで直る場合もありますが、クラス名やOutletの不整合が原因なら設定修正が必要です。
まとめ
XcodeのCompileStoryboard失敗は、Storyboard内のCustom Class、Module、IBOutlet・IBAction、Deployment Target、Target Membership、XML破損などを順番に確認すると切り分けやすくなります。まずビルドログの直前にある詳細エラーを確認し、該当Storyboardの設定を修正してください。原因が見つからない場合はDerivedDataのクリアやibtoolによる確認も有効です。
