0

AppDelegate でプログラムによって作成された UITabBarController を取得しました。また、いくつかの UIViewController を内部に持つ 2 つの UINavigationController を作成しました。次のように、ナビゲーション コントローラーを UITabBarController に追加しました。

    BVMapViewController *mapViewController = [[[BVMapViewController alloc] initWithNibName:@"BVMapViewController_iPhone" bundle:nil] autorelease];
    BVFavoritesViewController *favoritesViewController = [[[BVFavoritesViewController alloc] initWithNibName:@"BVFavoritesViewController_iPhone" bundle:nil] autorelease];

    UINavigationController *navigationController = [[[UINavigationController alloc] initWithRootViewController:mapViewController] autorelease];
    [navigationController setToolbarHidden:YES];
    UINavigationController *navigationControllerForFavorites = [[[UINavigationController alloc] initWithRootViewController:favoritesViewController] autorelease];

    self.tabBarController = [[[UITabBarController alloc] init] autorelease];
    NSArray* controllers = [NSArray arrayWithObjects:navigationController, navigationControllerForFavorites, nil];
    self.tabBarController.viewControllers = controllers;
    [self.window setRootViewController:self.tabBarController];

結果は、2 つのナビゲーション コントローラーを持つタブ バー コントローラーを作成することで正しく機能します。

問題は次のとおりです。最初の UINavigationController には、内部に MKMapView を持つ UIViewController が含まれています。そのマップには一連の POI が表示されるため、そのうちの 1 つをタップすると、アプリは(バックグラウンドで) Web サービスにリクエストを送信し、終了するとすぐに、別の UIViewController をナビゲーション スタックにプッシュして表示するビュー コントローラーに通知します。そのPOIに関する追加情報、

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

ここで、次のエラーが表示されます。

_WebTryThreadLock(bool), 0x11d9b560: メイン スレッドまたは Web スレッド以外のスレッドから Web ロックを取得しようとしました。これは、セカンダリ スレッドから UIKit を呼び出した結果である可能性があります。現在クラッシュ中... 1 0x58a76a9 WebThreadLock 2 0x5bfdfe -[UITextView _updateForNewSize:withOldSize:] 3 0x5c00b4 -[UITextView setFrame:] 4 0x4c59df UIViewCommonInitWithFrame 5 0x4c5bae -[UIView initWithCoder:] 6 0x4d9fb7 -[UIScroll0xUI 5] 8bcroll0xUI 5 initWithCoder:] 8 0x7b1a02 UINibDecoderDecodeObjectForValue 9 0x7b10e5 -[UINibDecoder decodeObjectForKey:] 10 0x6a2648 -[UIRuntimeConnection initWithCoder:] 11 0x7b1a02 UINibDecoderDecodeObjectForValue 12 0x7b1418 UINibDecoderDecodeObjectForValue 13 0x7b10e5 -[UINibDecoder decodeObjectForKey:] 14 0x6a1aa3 -[UINib instantiateWithOwner:options:startDeferredTransitionIfNeeded:] 25 0x5804a3 -[UINavigationController pushViewController:transition:forceImmediate:] 26 0x580098 -[UINavigationController pushViewController:animated:] 27 0x386f -[BVMapViewController parserDidFinishWithStation:] 28 0x785c -[BVParser parseStation:] 29 0xf8a0d5 -[NSThread main] 30 0xf8a034 NSThread_main 31 0x94e53ed9 _pthread_start

メインスレッドでこれを実行しようとしましたが、プッシュされたコントローラーのビューがすべて黒くなります。

よろしくお願いします。良い一日を。

4

1 に答える 1

1

質問でほのめかしたように、View Controllerをメインスレッドにプッシュする必要があります。UIKit との対話は、メイン スレッドで行う必要があります。

黒く表示される理由については、標準的なトラブルシューティング手法で解決する必要がある別の問題です。メイン スレッドで正常に実行されたら、表示されているクラスのさまざまなメソッド (viewDidLoad など) にブレークポイントを設定し、どこでトリップしているかを確認します。

于 2012-10-21T19:28:36.967 に答える