收到NSNotification后导航到特定的UIViewController

我正在开发一个iOS应用程序,使用UINavigationController处理UIViewController对象的层次结构:

 MenuViewController | |-ListOfAnimalsViewController | |-AnimalDetailsViewController | |-ListOfPlantsViewController | |-PlantDetailsViewController 

应用程序接收本地NSNotification对象与某个动物或植物的信息。 触摸通知时的常见行为是打开应用程序,并在层次结构中加载第一个视图控制器。

有没有一种方法,以编程方式导航到深层次的UIViewController实例呢?

编辑:我不是要求把控制器推入导航堆栈,但也推动以前的控制器,即我想保持上面的导航架构。

我不得不不同意苏雷什。 虽然这个解决scheme可能在这样一个简单的情况下工作,只有一个以前的ViewController,如果你想添加第10个ViewController并保持整个层次结构呢? 首先,您必须通过每个ViewController传递您想要显示的最后一部分数据(在本例中为植物或动物),您将一次创build10个ViewController。 目前的ViewController与第十代之间的转换将远远没有完成,性能将是可怕的。 也没有必要去创build自己的导航系统,因为这个问题不是太困难,所以不需要做比它们更复杂的事情。

只要按下你想要显示的ViewController,那样你只会创build1个ViewController。 在每个可以作为通知推送的ViewController(以及下面的所有的ViewController)中,覆盖后退button的行为。 如果前面的ViewController是你期望的,使用NSStringFromClass检查navigationController的viewControllers属性。 如果没有,创build一个NSMutableArray作为viewControllers的副本,创build您期望的ViewController并将其插入数组中的倒数第二个点。 然后通过调用navigationController上的setViewControllers:animated:方法replace整个堆栈,并使用mutable数组,animationNO。 最后做stream行音乐。 再一次,您将只创build一个ViewController,保持您的性能最佳。

因为我在iPad上,所以我现在不能发布代码,但是如果你需要的话,只要问一下,我会添加一个例子,当我有一个真正的键盘。

如果您知道该类的名称,则可以使用以下代码进行导航。

 NSString *className = @"viewControllerName"; UIViewController* myClass = (UIViewController*)[[NSClassFromString(className) alloc] init]; [self.navigationController pushViewController:myClass animated:YES]; 

我想你将不得不发明自己的机制来跟踪导航顺序,因为在iOS视图控制器的静态定义中没有定义任何顺序。 (Segges似乎尽可能接近,这不是很接近。)

如果我必须这样做一个层次的视图控制器有一些未知的深度,我会考虑创build一个超类,与path工作,有点像networking路由。 它将有一个方法,如displayNextControllerOnPath:(NSString *)path 。 一个MenuViewController是一个RoutingController子类,它会接收一个类似于@“ListOfAnimalsViewController.AnimalDetailsViewController”的path,去掉第一个path元素,实例化它(它是另一个RoutingController子类),并发送它@“AnimalDetailsViewController”。

其他细节将涉及知道何时停止,并可能传递一个对象或字典作为最后一个控制器用作内容的有效载荷。

我会按以下方式重build堆栈:

 MenuViewController *menuController = [[MenuViewController alloc] init]; ListOfAnimalsViewController *listController = [[ListOfAnimalsViewController alloc] init]; AnimalDetailsViewController *detailsController = [[AnimalDetailsViewController alloc] init]; UINavigationController *navigationController = [[UINavigationController alloc] init]; [navigationController setViewControllers:@[menuController, listController, detailsController]]; self.window.rootViewController = navigationController; 

您可能需要根据您的实施设置一些属性。