Autorayout のセルを iOS 5 で読み込むとエラーになる

SPECIAL


アプリ実行時に NSInternalInconsistencyException で落ちる

iPhone アプリを制作していたところ、Xcode 4.5 で新規に作成した簡単な UITableViewController ベースのアプリが、iOS 5.1 での実行直後に落ちる問題に遭遇しました。

iOS 5 シミュレーターでアプリを起動すると、直ぐに強制終了されて、次のエラーがデバッグコンソールに出力されます。

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException' reason: 'The NIB data is invalid.'

このとき、iOS 6.0 シミュレーターでの実行なら大丈夫でした。

 

このエラーがどこで発生しているかを探ってみると、UITableViewController を派生した先の、tableView:cellForRowAtIndexPath: メソッドの中で発生していることが分りました。

具体的にはその中の、次のようなセルをキューから取り出しているところで発生していました。

EzSampleTableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

iOS 6.0 なら正常に動作するのですけど、iOS 5.1 の場合はこの行で例外エラーが発生します。

 

この原因を調べて行くと、それは非常に単純で、この CellIdentifier で取り出すセルが登録されている Storyboard ファイルの "Use Autorayout" にチェックが入っていることが原因でした。

Autorayout は iOS 6.0 からの機能のため、それを有効にしたセルを iOS 5.1 で使ったために発生していたエラーですね。

原因がわかってしまえば修正は簡単で、該当する Storyboard ファイルの File Inspector の "Interface Builder Document" にある "Use Autoreyout" のチェックをはずすことで、iOS 5.1 でも問題なく動作するようになりました。