Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[UIViewController _loadViewFromNibNamed:bundle:] loaded the "*******" nib but the view outlet was not set.'

xibファイルを追加したり削除したりしていると、このようなエラーに見舞われることがあります。クリーンビルドしてもダメ。ハマりどころです。

自動で読まれるxibのファイル名に注意

まず理解しておくべきことは、UIViewControllerはxibファイルを指定しない場合、自動で以下のファイルを読もうとすることです。

  • ViewControllerのクラス名と一致するxibファイル。たとえばMyViewControllerならMyViewController.xibを読もうとする
  • 上記の条件でxibが読めなかったら、ViewControllerのクラス名からControllerを抜いた名前と一致するxibファイルを読もうとする。たとえばMyViewControllerならMyView.xibを読もうとする

意図しないxibファイルが読まれるとエラーを吐いてクラッシュすることがあります。例えば以下のようにクラスを作った時にそうなるでしょう。

  • MyViewController
  • MyView – MyViewControllerクラスがsubviewとして使うクラス
  • MyView.xib – MyViewとひもづくxibファイル

Viewのsubclassとxibのひもづけに関する記事を書きましたが、こういう構成にするとMyViewクラスとMyView.xibをひもづけるつもりが、MyViewControllerの初期化メソッドでMyView.xibが読まれてしまい、エラーを吐いてクラッシュします。

このような構成するなどして回避するべきでしょう。

  • MyViewController
  • MyContentView
  • MyContentView.xib

xibファイルを消したのにViewControllerが読みにいく

  • MyViewController
  • MyViewController.xib

このようにファイルを作ったけど、やっぱりxibを使わずにプログラムでsubviewを生成して配置しようと心変わりしたとします。xibを削除してアプリを起動すると、最初に書いたエラーを吐いてクラッシュします・・・

どうも削除したxibの情報が残ってしまうようです。クリーンビルドしてもダメ。アプリをSimulatorまたは実機から削除してからビルドすると確実に解決します。