使用数组导航到 ViewControllers

Using an array to navigate to ViewControllers

我目前正在完善我为(目前仅)IOS 制作的应用程序。在这个应用程序中,我有 15 个不同的 UIViewControllers,每个显示不同的数据并使用不同的 objects.

我的菜单具有层次结构(不是二进制)。我有 4 "parent" ViewControllers。这些parentViewControllers各有1个或多个"child"ViewControllers:

  1. Roster
    • EventDetails
      • Directions
      • MapView
  2. ChangeRequests
    • NewChangeRequest
    • ChangeRequestDetails
  3. Contacts
    • ContactDetails
      • ProgressReport
        • NewReportEntry
  4. 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
  }