使用数组导航到ViewControllers

时间:2015-01-14 12:09:26

标签: c# ios xamarin.ios xamarin

我正在努力改进我为(目前只有)IOS制作的应用程序。在这个应用程序中,我有15个不同的UIViewControllers,每个ViewControllers显示不同的数据并使用不同的对象。

我的菜单有层次结构(不是二进制)。我有4个“父母”ViewControllers。这些父ViewControllers每个都有一个或多个“子”Roster

  1. EventDetails
    • Directions
      • MapView
      • ChangeRequests
  2. NewChangeRequest
    • ChangeRequestDetails
    • Contacts
  3. ContactDetails
    • ProgressReport
      • NewReportEntry
        • DoubleChecks
  4. NewDoubleCheck
    • DoubleCheckDetails
    • DoubleCheckPhotoDetails
      • ViewControllers
  5. 在父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

2 个答案:

答案 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);
}