我正在开发一款iOS应用,处理的层次结构UIViewController
使用对象UINavigationController
:
MenuViewController
|
|-ListOfAnimalsViewController
|
|-AnimalDetailsViewController
|
|-ListOfPlantsViewController
|
|-PlantDetailsViewController
应用程序接收本地NSNotification
具有一定的动物或植物的信息的对象。 当你触摸通知通常的行为是打开应用程序并加载在层次结构中的第一个视图控制器。
是否有编程方式导航到一个实例的方式UIViewController
深处,而不是层次结构?
编辑:我不要求推控制器进入导航堆栈,但对于推动前面的控制器,以及,即我想保持上面的导航模式。
我会与苏雷什不同意。 虽然这种解决方案可以在一个简单的情况下,像这样的工作,你只需要1周先前的ViewController,如果你想添加一个10视图控制器,并保持整个层次结构是什么? 首先,你必须通过你要显示(在这种情况下,植物或动物)通过每一个视图控制器的数据的最后一块,你会立刻产生10个ViewControllers。 当前视图控制器和10日之间的过渡将是远离无缝,性能将是可怕的。 也没必要去创建自己的导航系统,没有必要让事情变得更复杂得多,他们是因为这个问题是不是太困难。
只要按下你要显示的视图控制器,这样,您只需要创建1个视图控制器。 在每一个可以推的通知(以下所有的)的结果视图控制器,覆盖后退按钮的行为。 检查在navigationController的viewControllers属性,如果视图控制器前IS是一个你期望的那样,使用NSStringFromClass。 如果没有,创建一个NSMutableArray作为viewControllers的副本,创建视图控制器你期望,并在倒数第二个点在数组中插入。 动画:然后通过调用setViewControllers更换整个堆栈上的navigationController方法与可变数组,动画NO。 最后做弹出。 同样,你会在同一时间创建仅1视图控制器,保持最佳性能。
Ican't邮编,现在因为我在iPad上,但如果你需要它,只是问,当我有一个真正的键盘,我将添加一个例子。
如果您知道类的名称,你可以使用下面的代码浏览。
NSString *className = @"viewControllerName";
UIViewController* myClass = (UIViewController*)[[NSClassFromString(className) alloc] init];
[self.navigationController pushViewController:myClass animated:YES];
我认为你必须发明自己的机制下的通航秩序,因为其中没有任何一款iOS视图控制器的定义排序静态清晰度。 (塞格斯似乎因为它得到这不是非常接近尽量接近)。
如果我必须为视图控制器与一些不知名的深层次做到这一点,我会考虑创建一个与路径的工作,有点像网络路由的超类。 这将有一个方法,如displayNextControllerOnPath:(NSString *)path
。 甲MenuViewController
这是一个RoutingController
子类将接收像@“ListOfAnimalsViewController.AnimalDetailsViewController”的路径,剥去第一路径元件,实例化(它是另一个RoutingController
亚类),并且将其发送@“AnimalDetailsViewController”。
其他细节将涉及知道什么时候停下来,也许传递对象或字典作为有效载荷的最后一个控制器作为内容使用。
我会重建以下列方式堆栈:
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;
您可能需要一些属性设置为根据您的实现。