我正在努力改进我为(目前只有)IOS制作的应用程序。在这个应用程序中,我有15个不同的UIViewControllers
,每个ViewControllers
显示不同的数据并使用不同的对象。
我的菜单有层次结构(不是二进制)。我有4个“父母”ViewControllers
。这些父ViewControllers
每个都有一个或多个“子”Roster
:
EventDetails
Directions
MapView
ChangeRequests
NewChangeRequest
ChangeRequestDetails
Contacts
ContactDetails
ProgressReport
NewReportEntry
DoubleChecks
NewDoubleCheck
DoubleCheckDetails
DoubleCheckPhotoDetails
ViewControllers
在父FlyoutMenu
上,我使用ViewControllers
(带数据源)来导航到其他父ViewControllers
。在孩子EventDetails
上我有一个自定义后退按钮,附有一个代表,带我回到上一个菜单。这就是问题所在。
我已经完成了将一些菜单相互链接的任务,以提高用户友好性。一个例子:
我目前正在NewDoubleCheck
菜单中。在此菜单中,我想要一个按钮将我带到PopViewController
菜单。这两个菜单都有一个后退按钮,使用NewDoubleCheck
导航回上一个菜单。如果我从DoubleChecks
访问DoubleChecks
,则会将我带回EventDetails
。但如果我从EventDetails
访问它,它会将我带回ViewControllers
,因为它位于堆栈的顶部。这意味着我最终陷入无尽的EventDetails循环 - > NewDoubleCheck - > EventDetails - > NewDoubleCheck。
长话短说:我希望能够使用ViewController
搜索PushViewController
堆栈,并能够选择要加载的FlyOutMenu
。
我正在考虑在我的应用程序开始时编写一个方法(我的Dictionary<string, UIViewController>
初始化附近的某个地方,我想,这将使我成为一个ViewControllers
数组的所有我的项目中{{1}},因此我可以更轻松地搜索和导航。这可能吗?
我知道这是一篇很长的文字,但我很高兴听到有关我的问题的任何意见和解决方案。
提前致谢。
亲爱的问候, 的Björn
答案 0 :(得分:1)
我在其中一个应用中遇到了同样的问题。 有趣的是,我检查了一些着名的&#39;商店里的应用程序,我注意到他们有这个无限循环&#39;问题。
我的解决方案是: 在导航到NewDoubleCheck之前,我会搜索它是否已存在于navigationController堆栈中。 如果是这种情况,那么我会弹出那个viewController,而不是推送一个新的。
这样的事情:
if ([self.navigationController.viewControllers[[self.navigationController.viewControllers count]-2] isKindOfClass:[NewDoubleCheck class]]) {
// ViewController already exist, so we need to get back to it
NewDoubleCheck *viewController = (NewDoubleCheck *)self.navigationController.viewControllers[[self.navigationController.viewControllers count]-2];
[self.navigationController popToViewController:viewController animated:YES];
} else {
// Push to NewDoubleCheck
}
答案 1 :(得分:0)
是的,您可以获得所有这样的视图控制器
NSArray *controllerArray = [[self navigationController] viewControllers];
for (UIViewController *controller in controllerArray){
NSLog(@"%@",controller.title);
}