使用数组导航到 ViewControllers
Using an array to navigate to ViewControllers
我目前正在完善我为(目前仅)IOS 制作的应用程序。在这个应用程序中,我有 15 个不同的 UIViewControllers
,每个显示不同的数据并使用不同的 objects.
我的菜单具有层次结构(不是二进制)。我有 4 "parent" ViewControllers
。这些parentViewControllers
各有1个或多个"child"ViewControllers
:
Roster
EventDetails
Directions
MapView
ChangeRequests
NewChangeRequest
ChangeRequestDetails
Contacts
ContactDetails
ProgressReport
NewReportEntry
DoubleChecks
NewDoubleCheck
DoubleCheckDetails
DoubleCheckPhotoDetails
在 parent ViewControllers
上,我使用 FlyoutMenu
(带数据源)能够导航到其他 parent ViewControllers
。在 child ViewControllers
上,我有一个自定义的后退按钮,它附有一个代表,可以让我返回到上一个菜单。问题来了。
我被分配给 link 一些菜单,以改进 user-friendliness。一个例子:
我目前在 EventDetails
菜单中。在此菜单中,我想要一个按钮将我带到 NewDoubleCheck
菜单。这两个菜单都有一个后退按钮,使用 PopViewController
导航回到上一个菜单。如果我从 DoubleChecks
访问 NewDoubleCheck
,它将带我回到 DoubleChecks
。但是,如果我从 EventDetails
访问它,它会将我带回到 EventDetails
,因为它位于堆栈的顶部。这意味着我最终陷入 EventDetails --> NewDoubleCheck --> EventDetails --> NewDoubleCheck 的无限循环。
长话短说:我希望能够搜索 ViewControllers
的堆栈并能够 select 加载正确的 ViewController
,使用 PushViewController
.
我正在考虑在我的应用程序开始时编写一个方法(在我的 FlyOutMenu
初始化附近的某个地方,我想,这将使我成为一个 Dictionary<string, UIViewController>
的数组,其中包含 ALL ViewControllers
在我的项目中,所以我可以更轻松地搜索和导航。这可能吗?
我知道这是一篇很长的文章,但我很高兴听到任何关于我的问题的意见和解决方案。
提前致谢。
尊敬的问候,
比约恩
是的,你可以获得所有这样的视图控制器
NSArray *controllerArray = [[self navigationController] viewControllers];
for (UIViewController *controller in controllerArray){
NSLog(@"%@",controller.title);
}
我在我的一个应用程序中遇到了同样的问题。
有趣的是,我检查了商店中的一些 'famous' 应用程序,我注意到它们有这个 'endless loop' 问题。
我的解决方案是:
在导航到 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
}
我目前正在完善我为(目前仅)IOS 制作的应用程序。在这个应用程序中,我有 15 个不同的 UIViewControllers
,每个显示不同的数据并使用不同的 objects.
我的菜单具有层次结构(不是二进制)。我有 4 "parent" ViewControllers
。这些parentViewControllers
各有1个或多个"child"ViewControllers
:
Roster
EventDetails
Directions
MapView
ChangeRequests
NewChangeRequest
ChangeRequestDetails
Contacts
ContactDetails
ProgressReport
NewReportEntry
DoubleChecks
NewDoubleCheck
DoubleCheckDetails
DoubleCheckPhotoDetails
在 parent ViewControllers
上,我使用 FlyoutMenu
(带数据源)能够导航到其他 parent ViewControllers
。在 child ViewControllers
上,我有一个自定义的后退按钮,它附有一个代表,可以让我返回到上一个菜单。问题来了。
我被分配给 link 一些菜单,以改进 user-friendliness。一个例子:
我目前在 EventDetails
菜单中。在此菜单中,我想要一个按钮将我带到 NewDoubleCheck
菜单。这两个菜单都有一个后退按钮,使用 PopViewController
导航回到上一个菜单。如果我从 DoubleChecks
访问 NewDoubleCheck
,它将带我回到 DoubleChecks
。但是,如果我从 EventDetails
访问它,它会将我带回到 EventDetails
,因为它位于堆栈的顶部。这意味着我最终陷入 EventDetails --> NewDoubleCheck --> EventDetails --> NewDoubleCheck 的无限循环。
长话短说:我希望能够搜索 ViewControllers
的堆栈并能够 select 加载正确的 ViewController
,使用 PushViewController
.
我正在考虑在我的应用程序开始时编写一个方法(在我的 FlyOutMenu
初始化附近的某个地方,我想,这将使我成为一个 Dictionary<string, UIViewController>
的数组,其中包含 ALL ViewControllers
在我的项目中,所以我可以更轻松地搜索和导航。这可能吗?
我知道这是一篇很长的文章,但我很高兴听到任何关于我的问题的意见和解决方案。
提前致谢。
尊敬的问候, 比约恩
是的,你可以获得所有这样的视图控制器
NSArray *controllerArray = [[self navigationController] viewControllers];
for (UIViewController *controller in controllerArray){
NSLog(@"%@",controller.title);
}
我在我的一个应用程序中遇到了同样的问题。 有趣的是,我检查了商店中的一些 'famous' 应用程序,我注意到它们有这个 'endless loop' 问题。
我的解决方案是: 在导航到 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
}