Уволить модал UIViewController во время передачи обслуживания

Я пытаюсь добавить передачу в свое приложение. Когда мое приложение разбудило Handoff, мне нужно закрыть несколько ViewControllers, чтобы вернуться к MKMapView, расположенному в моей иерархии представлений.

Моя иерархия представлений выглядит так:

+ NavController

+ --- MyMapViewController (содержит MKMapView, куда я хочу перейти, верхнюю часть NavController)

+ --- MyTabbarViewController (это панель вкладок с несколькими представлениями...)

+ --- MyOverviewViewController (помещается в стек моего NacController с помощью VC, который отображается в MyTabbarViewController)

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

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

Когда приложение получает UserActivity, отображаемым контроллером представления является "MyChartViewController".

Чтобы показать результат активности пользователя, мне нужно перейти к MyMapViewController, чтобы отобразить некоторую информацию о MapView.

Моя проблема заключается в том, чтобы найти простой способ отклонить "MyChartViewController" и "MyDetailsViewController" перед вызовом [navController popToRootViewControllerAnimated:TRUE];

Я пытался [navController.visibleViewController dismissViewControllerAnimated:FALSE завершение: ноль]; но он отклоняет только MyChartViewController, почему?

navController.visibleViewController - это MyDetailViewController.

Единственное решение, которое я нашел, это вызвать: [MyChartViewController dismissViewControllerAnimated:FALSE завершение:Nil]; AND [navController.visibleViewController dismissViewControllerAnimated:FALSE завершение: ноль];

Моя иерархия представлений может быть более сложной или разной в зависимости от того, где находится пользователь в приложении, когда активируется UserActivity. Я ожидаю найти простое решение, которое можно использовать в любой ситуации. Основная проблема заключается в том, чтобы распустить стек модалов viewController.

Я всегда хочу вернуться к этому MyMapViewController, который находится на вершине NavController.

Любая идея?

Спасибо!

3 ответа

Решение

Пожалуйста, смотрите ниже мое простое решение. Я написал метод, который отклоняет все ViewControllers, отображаемые в верхней части видимого контроллера представления моего NavigationController.

Когда все "модальные" viewControllers отклонены, я просто вставляю 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];

}

Если контроллер корневого представления всегда MyMapViewControllerто эта задача довольно проста - просто установите корневой контроллер вида window снова быть UINavigationController это имеет MyMapViewController как корень.

Я бы настроил и размотал сеанс в VC, к которому вы хотите откатиться, а затем в VC, который вы хотите отменить, я бы проверил условия для отката в viewWillAppear: и вызвал бы раскрутку, если он удовлетворяет условиям

Другие вопросы по тегам