2011年10月19日水曜日

やっぱりInterface Builderは信用できない?

バギーな Xcode 4.2 にやられたお話しです。

iOS 5 の Storyboard を試すために、Xcode 4.2 でサンプルプロジェクトを作りました。
テンプレートから Tabbed Application を選び、とりあえず iPhone/iPad の Universal 対応にしました。
この時点で一回ビルドして、シミュレーター上で動作を確認しました。
ソースコードがほとんど空にも関わらず、画面遷移するアプリケーションが出来上がりました。
楽だなと思いつつ、若干の不安も覚えます。極度にブラックボックス化された環境で、バグや問題が起きると、何が起きてるのかを追うのにとても苦労するからです。

MainStoryboard_iPhone.storyboard を Interface Builder で開いて、2つ表示されるビューのうち1つを改造して、UITableView を配置しました。
UITableView の delegate、dataSource を UIViewController に接続して、必要なメソッドも追記します。

自分のミスもあり、何度かビルド&実行を繰り返しましたが、UITableView にデータが表示されません。 最初は自分のミスかと思い、色々調べてみると、くだんの UITableView と IBOutlet 接続した myTableView 変数が nil を示しています。なのに UITableView 本体は表示されています。この時点で???となりました。
myTableView 変数をチェックしたのは viewDidLoad メソッド内なので、アウトレットの接続は済んでいるはずです。

まったく分からないまま途方にくれて、2つ目のビューにも UITableView を配置してビルド&実行しました。
するとなんと!変更が反映されておらず、編集前のビューが表示されています。
Interface Builder 上では、もちろん UITableView が配置されています。
2つのUITableViewを配置したところ
 もうこれは Xcode を疑った方が良いと思い、Product -> Clean を行い、DerivedData フォルダを削除しました。
それでも直りません…。
そして今度は、iOSシミュレータ上にインストールされている、このアプリ自体を削除しました。ゴミが残っているかと思ったからです。
すると今度は、以下の UIApplicationMain 部分で、実行時エラーがでました。
int main(int argc, char *argv[])
{
 @autoreleasepool {
     return UIApplicationMain(argc, argv, nil, NSStringFromClass([TestTableAppDelegate class]));
 }
}
そもそも TestTableAppDelegate クラスはテンプレートのままなので、自分にバグを挿入できる余地はありません。

いろいろな実験結果から、MainStoryboard_iPhone.storyboard ファイルのキャッシュか何かが、悪さをしていることは明らかです。
そこで、MainStoryboard_iPhone.storyboard をリネームして、MainStoryboard.storyboard にしました。
Universal アプリもやめて、iPhone 専用にしました。
以下のように設定します。

これでビルド&実行すると、めでたく Storyboard を編集した通りの表示が行われました。私の1日を返して下さい…。

0 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...