Вернуться к RootViewController из Modal View Controller
Из Home view - мой RootViewController - я открываю 2 ViewControllers один за другим, когда пользователь переходит в иерархию навигации следующим образом:
1) SecondViewController нажата кнопкой, подключенной в моей раскадровке
2) ThirdViewController представлен модально
[self performSegueWithIdentifier:@"NextViewController" sender:nil];
Итак, на картинке: RootViewController → SecondViewController → ThirdViewController
Теперь в моем ThirdViewController я хочу, чтобы кнопка возвращалась 2 раза в мой RootViewController, т.е. возвращалась домой. Но это не работает:
[self.navigationController popToRootViewControllerAnimated:YES];
Только этот парень возвращается один раз к SecondViewController
[self.navigationController popViewControllerAnimated:YES];
Как я могу одновременно удалить как модальные, так и push-контроллеры?
Ответы
Ответ 1
У меня была аналогичная ситуация, когда у меня было несколько контроллеров представлений, которые были введены в стек навигационного контроллера, а затем последний вид был представлен модально. На модальном экране у меня есть кнопка "Отмена", которая возвращается к контроллеру корневого представления.
В контроллере модального представления у меня есть действие, которое срабатывает при нажатии кнопки "Отмена":
- (IBAction)cancel:(id)sender
{
[self.delegate modalViewControllerDidCancel];
}
В заголовке этого модального контроллера представления я объявляю протокол:
@protocol ModalViewControllerDelegate
- (void)modalViewControllerDidCancel;
@end
И тогда последний контроллер представления в стеке навигации (тот, который представил модальное представление) должен реализовать протокол ModalViewControllerDelegate
:
- (void)modalViewControllerDidCancel
{
[self dismissViewControllerAnimated:NO completion:nil];
[self.navigationController popToRootViewControllerAnimated:YES];
}
Этот метод выше - важная часть. Он получает диспетчер представления представления, чтобы отклонить модальное представление, а затем он возвращается к контроллеру корневого представления. Обратите внимание, что я передаю NO
для отклоненияViewControllerAnimated: и YES
к popToRootViewControllerAnimated: чтобы получить более плавную анимацию от модального представления до корневого представления.
Ответ 2
У меня было такое же требование, но я использовал пользовательские сегменты между контроллерами представлений. Я столкнулся с концепцией "Unwind Segue", который, как я думаю, пришел с iOS6. Если вы ориентируетесь на iOS6, и выше эти ссылки могут помочь:
Что такое Unwind segues и как вы их используете?
http://chrisrisner.com/Unwinding-with-iOS-and-Storyboards
Спасибо.
Ответ 3
Предполагая, что ваш AppDelegate называется AppDelegate, вы можете сделать следующее, которое будет reset rootviewcontroller для окна приложения в качестве представления RootViewController
AppDelegate *appDel = (AppDelegate*)[[UIApplication sharedApplication] delegate];
RootViewController *rootView = [[RootViewController alloc] init];
[appDel.window setRootViewController:rootView];