2

アプリにハンドオフを追加しようとしています。アプリが Handoff によって起動されたら、いくつかの ViewController を閉じて、ビュー階層にある MKMapView に戻る必要があります。

私のビュー階層は次のようになります。

+ナビコントローラー

+--- MyMapViewController (NavController の上に、行きたい MKMapView が含まれています)

+--- MyTabbarViewController (複数のビューを持つタブ バーです...)

+--- MyOverviewViewController (MyTabbarViewController に表示される VC によって NacController のスタックにプッシュされる)

 +--- MyDetailViewController (it's a modal view presented by MyOverviewController)

 +--- MyChartViewController (it's a modal view presented by MyDetailViewController)

アプリが UserActivity を受け取ると、表示されるビュー コントローラーは「MyChartViewController」です。

ユーザー アクティビティの結果を表示するには、MyMapViewController に移動して、MapView に関する情報を表示する必要があります。

私の問題は、[navController popToRootViewControllerAnimated:TRUE]; を呼び出す前に、「MyChartViewController」と「MyDetailsViewController」を閉じる簡単な方法を見つけることです。

[navController.visibleViewController disconnectViewControllerAnimated:FALSE completion:Nil]; を試しました。しかし、MyChartViewController だけを却下するのはなぜですか?

navController.visibleViewController は MyDetailViewController です。

私が見つけた唯一の解決策は、次のように呼び出すことです。AND [navController.visibleViewController disconnectViewControllerAnimated:FALSE 完了:Nil];

ビューの階層は、UserActivity がトリガーされたときにユーザーがアプリ内のどこにいるかによって、より複雑になったり、異なったりする可能性があります。どんな状況でも使えるシンプルな解決策が見つかることを期待しています。主な問題は、モーダル viewController のスタックを破棄することです。

NavController の上にあるこの MyMapViewController に戻りたいといつも思っています。

何か案が?

ありがとう!

4

3 に答える 3

1

以下の私の簡単な解決策をご覧ください。NavigationController の可視ビュー コントローラの上部に表示されているすべての ViewController を閉じるメソッドを作成しました。

すべての「モーダル」viewController が閉じられたら、NavigationController をルートにポップするだけです。

アプリで管理しなければならないすべての状況で機能しているようです。

+(void) dismissModalAndPopToRoot:(UINavigationController*) navController {

if (navController.visibleViewController.parentViewController == Nil) {
    // it's not a children of the NavController, so it's most probably a modal or several modals
    UIViewController* currentViewController = navController.visibleViewController;
    NSMutableArray* stackOfPresentedVC = [[NSMutableArray alloc] init];

    while (currentViewController.presentedViewController != Nil) {
        [stackOfPresentedVC addObject:currentViewController];
        currentViewController = currentViewController.presentedViewController;
    }
    [stackOfPresentedVC addObject:currentViewController];

    for (NSInteger i = (stackOfPresentedVC.count) - 1; i >= 0; i--) {
        currentViewController = stackOfPresentedVC[i];
        [currentViewController dismissViewControllerAnimated:FALSE completion:Nil];
    }
}

[navController popToRootViewControllerAnimated:TRUE];

}

于 2014-12-03T17:12:28.560 に答える