Storyboardを使用したViewControllerで "Could not load NIB in bundle" エラーが出たときの対処
先日強烈にハマったのでメモ。
Storyboardを使用したViewController、どう初期化するか?
xcode - initWithNibName method in storyboard - Stack Overflow
Storyboardを使用したViewControllerを実装しているのですが、「ViewControllerオブジェクトの初期化時には initWithNibName も呼ばれないしinitWithFrame も呼ばれません。initWithCoder を使ってね!」という記述を見かけたのですが…。
こうかな?→突然の死
それに従って
@implementation HogeViewController -(id)initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder]; if (self) { self.view.backgroundColor = [UIColor whiteColor]; } return self; }
こんなことをしてしまうと、下記のような謎エラーを吐いて死にます。
2012-10-24 XX:XX:XX.XXX HogeProject[24370:907] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle (loaded)' with name 'quk-0R-mEk-view-h0N-xB-WBb''
こわいよ。こわい。
実際のところ、以下のように、awakeFromNib メソッドをオーバーライドするのが正しいみたいなので、みなさまお気を付け下さい。
-(void)awakeFromNib { self.view.backgroundColor = [UIColor whiteColor]; }
結論: ドキュメントはちゃんと読みましょう
Appleのドキュメントにも、「ViewControllerの初期化にはawakeFromNibをオーバーライドしてね!」ってちゃんと書いてあるので、ちゃんとドキュメント読めっていう結論になりますね。ごめんなさい。
この機会にViewControllerのライフサイクルについて理解を深めればいいじゃないかという話なのですが、 伏魔殿っぽくてこれ以上の興味が沸かないのが残念なところです。
参考:
View Controller Programming Guide for iOS
iphone - Could not load NIB in bundle: 'NSBundle when using storyboarding - Stack Overflow