【问题标题】:Handle Navigation in Objective c在 Objective c 中处理导航
【发布时间】:2014-12-05 10:49:18
【问题描述】:

我觉得我有点麻烦。我的 iPhone 应用程序中有 5 个视图控制器。例如,它们的名称类似于一、二、三、四和五,它们的导航流程类似于 1->2->3->4->5。现在我的困惑是,当我单击第 5 个视图控制器中的按钮时,我想查看第 3 个视图,但是当我单击返回按钮时,它会返回到第 5 个视图。我想要 2 代替 5。我该怎么做?我的代码:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
SettingViewController *dealVC1 = (SettingViewController *)[storyboard instantiateViewControllerWithIdentifier:@"SettingViewController"];
[self.navigationController pushViewController:dealVC1 animated:YES];

我将上面的代码用于所有导航。

【问题讨论】:

  • 我可以为您看到两个选项:1)当用户按下第 5 个 vc 上的按钮时,弹出到您的第 3 个 vc 而不是创建一个新的。 2)不要使用UINavigationViewController,而是自己做所有的工作,这样你就可以控制所有的导航
  • 使用自定义后退按钮或展开 segue 或手动处理默认后退按钮
  • UITabBarController?

标签: ios objective-c ios7 uinavigationcontroller


【解决方案1】:

假设您所有的导航控制器都只是 UIViewController 并且它们的标识符是 vc1 用于第一个视图控制器 vc2 用于第二个等。

现在假设您在第 5 个视图控制器中,并且在您的父级 UINavigationController.viewControllers 数组中,您有:[vc1, vc2, vc3, vc4, vc5]。现在如果你想回到第二个视图控制器,你应该在第五个视图控制器中添加这个函数:

- (void)popTo2ndViewController {
    NSArray *controllers = self.navigationController.viewControllers;
    UIViewController *vc2 = controllers[1]; // If your viewControllers doesn't look like 1>2>3>4>5 here you may get an error.
    [self.navigationController popToViewController:vc2 animated:YES];
}

要调用此函数,您应该覆盖@iDeveloper 在他的回答中提到的后退按钮操作。当popTo2ndViewController 完成时,self.navigationController 数组将如下所示:[vc1, vc2]

【讨论】:

  • 这正是我的评论的意思:)
  • 如何在应用委托方法中使用它?你有什么想法吗?
  • 在应用程序代理中没有UINavigationController,但要创建它,您可以像使用“SettingViewController”一样做。我做了一个简单的代码,可能会引导你:pastie.org/9637024祝你好运!
  • 哦,谢谢你的帮助 :) 很高兴和你聊天 Szu
【解决方案2】:

您可以覆盖导航栏左栏按钮中显示的backButton,并定义自己的操作以在第二个或任何视图控制器中进行。

【讨论】:

    【解决方案3】:

    为什么要推送视图控制器 3?而是弹出视图控制器 3,因此在视图控制器 3 的后面,您将拥有视图控制器 2。

    遍历导航控制器中的所有视图控制器。为视图控制器 3 设置条件,然后弹出到该控制器。

    
    NSArray *arr = self.navigationcontrollers.viewcontrollers; 
    
    for(int i = 0; i&lt[arr count]; i++) {
       if([arr objectAtIndex:i]isKindOgClass:[ViewController3 Class]]) {
          ViewController3 *v3 = (ViewController3 *)[arr objectAtIndex:3];
          [self.navigationcontroller popToConroller:v3 animated:YES];
          break;
       }
    }
    
    

    我不确定,这是否适用于 Storyboard。但是尝试一次。

    【讨论】:

      【解决方案4】:

      而不是转到您当前的 3 号视图控制器,将 3 号视图控制器推入导航堆栈并传递您需要的数据。

      like 1 -> 2 -> 3 -> 4 -> 5 -> 3 ,所以推回新的数字 3 会根据需要返回到 5。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 2015-11-14
        • 1970-01-01
        • 1970-01-01
        • 2017-04-14
        • 2012-03-03
        相关资源
        最近更新 更多