Уволить модал 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: и вызвал бы раскрутку, если он удовлетворяет условиям