0

新しいView ControllerをNavigation Controllerにプッシュする簡単なコードがあります

- (IBAction)buttonSelected:(id)sender{
    caseBillingFormViewController = [[CaseBillingFormViewController alloc] initWithStyle:UITableViewStyleGrouped];
    caseBillingFormViewController.returnScreen = @"FALSE";
    [self.navigationController pushViewController:caseBillingFormViewController animated:YES];
}

最終行でクラッシュします:

[self.navigationController pushViewController:caseBillingFormViewController animated:YES];

なぜこれが起こっているのかわかりません。これは iOS6 に新たに追加されたものです。コードベースはアップグレード バージョン間で変更されていないため、なぜこれが起こっているのかわかりません。

私の caseBillingFormViewController は私のインターフェース内で命名されています:

CaseBillingFormViewController *caseBillingFormViewController;

self.navigationController の整合性を確認しましたが、すべてチェックアウトされています。

NSLog(@"%i",[self.navigationController respondsToSelector:@selector(pushViewController:animated:)]); 
//gives 1

問題は、これが UITableView によって管理される画面にのみ表示されることです -

caseBillingFormViewController = [[CaseBillingFormViewController alloc] initWithStyle:UITableViewStyleGrouped];
//crashes

savedOrdersViewController = [[SavedOrdersViewController alloc] initWithNibName:@"SavedOrdersViewController" bundle:[NSBundle mainBundle]];
//does not crash

なぜこれが起こっているのか、誰かが光を当てることができますか?
Simulator 5.1 と Simulator 6.0 で同じコードをテストしました - エラーは後者でのみ発生します。

注意、エラーは次のとおりです。

'NSUnknownKeyException', reason: '[<CaseBillingFormViewController 0xc09c0b0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key theTableView.'
4

2 に答える 2

1

「initWithNibName:bundle:」は、UIViewController の指定された初期化子であることに注意してください。あなたのサブクラスは2つのnilを持っていますか(これは問題ありません)?UIViewController が init ルーチンで何をしているのかわからないので、それを呼び出す必要があります。そうしないと、根拠が不安定になります。

これが過去に機能していた場合は、「loadView」を実装したと思います。その場合は、サブクラス init でプロパティとして指定されたスタイルでテーブルを作成できます (指定されたものをスーパーに呼び出す限り)。

以前は機能していたが、現在は機能していない理由は、運が良かったからです。Apple は、'initWithNibName:bundle:' で何か重要なことをしているに違いありません。

また、UITableViewController (UIViewController ではない) をサブクラス化している場合は、self.tableView を self.view に設定する必要がある場合がありますが、いずれにしても、オブジェクトを作成した後、プッシュする前に、その両方を確認する必要があります。 view と tableView が設定されます - プッシュの前にそれらをログに記録します。いずれかが nil の場合は続行しないでください。

于 2012-09-26T18:18:06.760 に答える
0

さて、それは関係ないと思ったので、xibファイルがあったことについては言及しませんでしCaseBillingFormViewControllerた.xibファイルがまったく機能していないことに気付いたとき、それを削除し、クラスを適切なすべての初期化子を持つ UITableViewController。

明確にします...
CaseBillingFormViewController.xib存在しません。
それは削除され、すべての参照が削除され、ファイル自体がゴミ箱に入れられて空になりました。コンパイルされたソースを確認するまで行ったところ、やはりありませんでした...

したがって、関連性がないと判断した理由。

修復するには、デバイスとシミュレーターからアプリを削除してから、ビルドをクリーンアップし、マシンを再起動して、再度クリーンアップしてからビルドする必要がありました。複雑に聞こえるかもしれませんが、これらの手順を 1 つも行わなくても、エラーは残りました。

X-Code には、削除されたファイル、特に xib とストーリーボードを登録しないというバグがあります。Apple からの回答は次のとおりです。

どのファイルが変更されたかを想定する場合、Xcode は正確ではなく、特にストーリーボードと xib ファイルの場合、アプリケーション バンドルの再構築を引き起こします。ご指摘のとおり、変更を実現するにはクリーンな操作を行う必要があります。これは Xcode のバグです。

サンドボックスの残りの部分 (Documents フォルダーなど) を保持したい場合は、Xcode オーガナイザーを使用すると、アプリのスタンドボックス (アプリ バンドルを除く) をデバイスから Mac にダウンロードできます。アプリが変更された後のデバイスに。したがって、オーガナイザーで、デバイスとその「アプリケーション」項目を選択し、適切なアプリケーションを選択して、[ダウンロード] ボタンをクリックすると、そのサンドボックスにデータ ファイルがダウンロードされます。

ファイルは削除されましたが、ファイルから変数を読み取っていました。エラーの UITableView インスタンスtheTableViewは、削除される前に xib に存在していました。

これは修正されたという意味ではありませんが、解決策が SO の誰の手にも及ばないことを意味します。とにかく助けてくれてありがとう。

于 2012-10-02T08:40:29.220 に答える