0

私のアプリはUINavigationControllerを使用してさまざまなUITableViewControllerを表示しています。ただし、非常に奇妙な動作があります。UITableViewControllerをナビゲーションコントローラーにプッシュすると、のアニメーションがNOpushViewController:animated:に設定されている場合にのみ機能します。

[navController pushViewController:tableController animated:NO]

アニメーションをYESに設定すると、tableControllerビューが表示される前にアプリがフリーズします。この時点で例外やエラーはありません。最後に、を投げて数分後にアプリがクラッシュしEXC_??? (11) (code=0, subcode=0x0)ます。しかし、これはどういう意味ですか?

いくつかの詳細情報:

すべてのコントローラーとビューはプログラムでロードされます。初め:

UITableViewController *tableController1 = [[UITableViewController alloc] init];
navController = [[UINavigationController alloc] initWithRootViewController:tableController1]
[self.view addSubview:navController.view];

ボタンをクリックした後、tableController2は以下を使用して設定されます。

UITableViewController *tableController2 = [[UITableViewController alloc] init];
[navController pushViewController:tableController2 animated:NO];
// -> NO works, YES freezes

tableController2を分析するために、独自のtableViewControllerも作成しました。結果は次のとおりです。ボタンをクリックして2番目のテーブルビューコントローラをロードした後、までのすべてのメソッドviewWillAppearが呼び出されます。viewDidAppearは呼び出されず、ビューは表示されません。

誰かがこの問題を解決するための解決策を見つける方法を知っていますか?または何かアイデア、私のコードに何が欠けている可能性がありますか?たくさんのコードをコメントアウトして何時間もデバッグしても、まだ役に立ちませんでした...

編集:

コメントで述べたように、を置き換える方が良い[self.view addSubview:navController.view];です。そこで、コードを変更し、ナビゲーションコントローラーのinitをappDelegateに移動しました。しかし、成功しなくても、同じ動作をします。

UITableViewController *tableController1 = [[UITableViewController alloc] init];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:tableController1];
NSArray* controllers = [NSArray arrayWithObjects:navController, ..., nil];
tabBarController.viewControllers = controllers;

tabBarControllerアプリのrootViewControllerにすぎません。これは、ナビゲーションコントローラーとそのコントローラーに影響を与えるべきではありません。

4

1 に答える 1

1

ナビゲーション コントローラーの初期化に問題があると思われます。

置き換えてみてください:

[self.view addSubview:navController.view];

次の場合:

self.window.rootViewController = navController;

もちろん、これはAppDelegateで行う必要があります。

編集:あなたのプロジェクトの何が問題なのかわかりません。あなたと同じナビゲーションロジックで新しいプロジェクトを作成しました。

application:didFinishLaunchingWithOptions:メソッドは次のとおりです。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor = [UIColor whiteColor];

    UITableViewController *tvc = [[PSTableViewController alloc] init];
    UINavigationController *navCtrl = [[UINavigationController alloc] initWithRootViewController:tvc];
    UIViewController *vc = [[UIViewController alloc] init];
    UITabBarController *tbc = [[UITabBarController alloc] init];
    tbc.viewControllers = @[navCtrl, vc];
    self.window.rootViewController = tbc;
    [self.window makeKeyAndVisible];
    return YES;
}

そして、これがテーブル ビュー コントローラーのtableView:didSelectRowAtIndexPath:メソッドです。別のテーブルビューコントローラーをプッシュするだけで、正常に機能します。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
     UITableViewController *detailViewController = [[UITableViewController alloc] init];
     [self.navigationController pushViewController:detailViewController animated:YES];
}

ここにサンプル プロジェクトをアップロードしました。それをダウンロードして、自分のものと比較することができます。幸運を。

于 2013-03-23T23:20:42.853 に答える