UINavigationController переходит к другому корневому контроллеру

У меня есть 3 контроллера просмотра. Первые 2 контроллера представления встроены в UINavigationController, как показано на скриншоте:

Скриншот раскадровки

Отправной точкой является UINavigationController View Controller 1. Затем я нажимаю на View Controller 3. Однако я хотел бы, чтобы он выскакивал в корень UINavigationController, содержащего View Controller 2. Как я могу изменить иерархию навигации?

  • нужно сохранить всплывающую анимацию
  • я знаю, что изменение контроллера корневого представления - это способ добиться этого, но это будет очень странно для пользователя.

пс. эта раскадровка упрощена для иллюстрации; это множество контроллеров представления между контроллерами представления 1, 2 и 3.


person Raptor    schedule 27.08.2015    source источник


Ответы (4)


В итоге я меняю всю иерархию UINavigationController следующими кодами:

// In the View Controller 3's button's `IBAction`:
NSArray *vcs = @[[self.storyboard instantiateViewControllerWithIdentifier:@"NavController1_Identifier"], self];
[self.navigationController setViewControllers:vcs];
[self.navigationController popToRootViewControllerAnimated:YES];

где NavController1_Identifier — идентификатор раскадровки первого UINavigationController.


Кажется, в этом случае можно использовать и раскрутку segue.

person Raptor    schedule 27.08.2015

Вам нужно изменить свой rootViewController. Вы можете перейти к любому контроллеру представления, только если он находится в том же стеке навигации.

person Rohit Kumar    schedule 27.08.2015
comment
Правильно, ваш второй контроллер представления не находится в том же навигационном стеке, что и ваш первый контроллер представления. - person yong ho; 27.08.2015

Поскольку второй контроллер представления, к которому вы хотите перейти, не находится в вашем навигационном стеке, вы не можете перейти к нему. Что вы можете сделать, так это не потерять плавную анимацию перехода:

1: нажмите, чтобы просмотреть контроллер 3

var contr = self.storyboard!.instantiateViewControllerWithIdentifier("3") as! ViewController3
self.navigationController?.pushViewController(contr, animated: true)

2: нажмите на контроллер просмотра 2 из контроллера просмотра 3, вы можете использовать тот же код, что и выше, просто обязательно измените идентификатор контроллера просмотра.

3: теперь вы можете вернуться отсюда к исходному экрану, с которого вы начали:

self.navigationController?.popToRootViewControllerAnimated(true)

Тем не менее, если вы хотите перейти к контроллеру представления 2 без нажатия, вы можете просто представить контроллер представления, это запустит стек навигации на контроллере представления 2, однако потеряет предыдущие представления.

person Maroun    schedule 27.08.2015

измените контроллер корневого представления, как показано ниже.

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UITabBarController *rootViewController = [storyboard instantiateViewControllerWithIdentifier:@"tabBarcontroller"];
[[UIApplication sharedApplication].keyWindow setRootViewController:rootViewController];
person Indrajit Chavda    schedule 27.08.2015
comment
stackoverflow.com/questions/22653993/ - person Indrajit Chavda; 27.08.2015
comment
Я знаю, что могу изменить контроллер корневого представления, но при этом потеряется анимация перехода всплывающих контроллеров представления. - person Raptor; 27.08.2015