UINavigationController изскача към друг основен контролер

Имам 3 View Controller. Първите 2 контролера за изглед са вградени в UINavigationController, както е показано на екранната снимка:

Екранна снимка на Storyboard

Началната точка е UINavigationController на View Controller 1. След това натискам към View Controller 3. Въпреки това, бих искал да изскочи до корена на UINavigationController, съдържащ View Controller 2. Как мога да променя навигационната йерархия?

  • трябва да запазите пукащата анимация
  • Знам, че промяната на контролера за изглед на root е начин за постигане, но това ще бъде много странно за потребителското изживяване

p.s. този сценарий е опростен с илюстративна цел; те са много контролери за изглед между View Controller 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.


Изглежда unwind 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