Вернуться к 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];