收到NSNotification后导航到特定的UIViewController

时间:2012-11-22 13:25:46

标签: objective-c ios uiviewcontroller uinavigationcontroller

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

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

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

是否有办法以编程方式导航到层次结构中UIViewController深的实例?

编辑:我不是要求将控制器推入导航堆栈,而是要推送以前的控制器,即我希望将导航架构保持在上面。

4 个答案:

答案 0 :(得分:2)

我不得不与Suresh不同意。虽然这个解决方案可能在这样一个简单的情况下工作,你只有1个以前的ViewController,如果你想添加第10个ViewController并保持整个层次结构怎么办?首先,您必须通过每个ViewController传递您想要显示的最终数据(在本例中为植物或动物),并且您将同时创建10个ViewControllers。当前ViewController和第10个之间的过渡远非无缝,性能会很糟糕。也没有必要去创建自己的导航系统,不需要让事情变得比他们复杂,因为这个问题并不太难。

只需按下要显示的ViewController,这样你就只能创建1个ViewController。在每个ViewController中,可以通过通知(以及下面的所有通知)推送,覆盖后退按钮的行为。如果之前的ViewController是你期望的那个,请使用NSStringFromClass检查navigationController的viewControllers属性。如果没有,创建一个NSMutableArray作为viewControllers的副本,创建您期望的ViewController并将其插入到数组中倒数第二个位置。然后通过调用带有可变数组的navigationController上的setViewControllers:animated:方法替换整个堆栈,动画NO。最后做流行音乐。再次,您一次只创建一个ViewController,保持最佳性能。

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

答案 1 :(得分:0)

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

NSString *className = @"viewControllerName";

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

答案 2 :(得分:0)

我认为您必须发明自己的机制来遵循导航顺序,因为iOS视图控制器的静态定义中没有定义排序的内容。 (Segues似乎尽可能接近并且不是非常接近。)

如果我必须为具有一些未知深度的视图控制器层次结构执行此操作,我会考虑创建一个使用路径的超类,类似于网络路由。它有一个方法,如displayNextControllerOnPath:(NSString *)path。作为MenuViewController子类的RoutingController将接收类似@“ListOfAnimalsViewController.AnimalDetailsViewController”的路径,剥离第一个路径元素,实例化它(它是另一个RoutingController子类),然后发送它@“AnimalDetailsViewController”。

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

答案 3 :(得分:0)

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

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;

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