【问题标题】:Push view from modal view and then popToRootView从模态视图推送视图,然后 popToRootView
【发布时间】:2016-07-13 10:19:10
【问题描述】:

这是我作为休闲(对象)的 ViewController:

  • FirstViewController - 带有标签栏 + 导航栏的视图,也是 ta 栏的一部分;
  • SecondViewController - 仅使用导航控制器查看
  • ThirdViewController - 仅使用导航控制器查看

以及我正在尝试做的事情(逻辑步骤):

  1. FirstViewController 呈现SecondViewController(模态)

  2. SecondViewController 推送ThirdViewController(推送)

  3. popToRootViewControllerAnimated - 从ThirdViewController 弹出到FirstViewController(弹出)

这是我正在逐步使用的代码:

  1. FirstViewController 类中

    SecondViewController * secondViewController = [[UIStoryboard MainStoryboard] instantiateViewControllerWithIdentifier:NSStringFromClass([SecondViewController class])];
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController: secondViewController];
    [self.navigationController presentViewController: navigationController animated:YES completion:nil];
    
  2. SecondViewController类中:

    ThirdViewController * thirdViewController = [[UIStoryboard MainStoryboard] instantiateViewControllerWithIdentifier:NSStringFromClass([ThirdViewController class])];
    [self.navigationController pushViewController: thirdViewController animated:YES];
    
  3. 我在ThirdViewController 上课:

    [self.navigationController popToRootViewControllerAnimated:YES];
    

我的问题在于第 3 点,当我弹出到根视图控制器而不是从 ThirdViewController 转到 FirstViewController 时,它只会转到 SecondViewController

【问题讨论】:

  • 很简单。您从第二个推送,当您弹出第三个时,您又回到第二个。因为当您推送时,self.navigationController 将具有 secondView 控制器的实例,但不是第一个。
  • 发布带有代码示例的官方答案,以便我投票

标签: ios objective-c uinavigationcontroller storyboard


【解决方案1】:

在第 1 步中,您创建了新的 UINavigationController 实例,并将 secondViewController 设置为它的 rootViewController。所以现在在第 2 步中,当您推送 thirdViewController 时,它将被添加到 secondViewController 的导航堆栈中。 最后在第 3 步中,当您调用“popToRootViewControllerAnimated”时,它会弹出到 secondViewController,因为 secondViewController 是导航的 rootViewController。

要转到 FirstViewController,请在 self.navigationController 上调用“dismissViewControllerAnimated”。

请参考以下代码。

[self.navigationController dismissViewControllerAnimated:YES completion:nil];

【讨论】:

    【解决方案2】:

    忘记第一步。即使您以模态方式呈现视图控制器,也将其设置为根视图控制器,直到您将其关闭。

    1. 您正在从第二个 VC 导航控制器推送它。

    2. 如果你弹出它,你会回到第二个 VC,因为第三个 VC 被推送到第二个导航控制器上。

    如果你想去你的第一个视图控制器,在第三个 VC 中再次呈现第一个 VC

      [self presentViewController:firstVC animated:YES completion:nil];
    

    或者你可以关闭

      [self.navigationController dismissViewController animated:YES completion:nil];
    

    请注意,参考中不能有多个导航控制器。您在任何时候都只能拥有一个。

    即使您通过第一个 VC 导航控制器呈现第二个 VC

      [self.navigationController  presentViewController:secondVC animated:YES completion:nil];
    

    您在这里展示了第二个 VC 导航控制器,因此在第一个 VC 导航堆栈中将添加另一个导航控制器。此时,第二个VC中调用self.navigationController时会引用第二个VC导航控制器

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-16
      • 1970-01-01
      • 2011-01-29
      • 1970-01-01
      • 2012-12-22
      • 1970-01-01
      • 1970-01-01
      • 2016-11-03
      相关资源
      最近更新 更多