【问题标题】:Start second view controller of navigation stack first首先启动导航堆栈的第二个视图控制器
【发布时间】:2019-03-23 14:58:57
【问题描述】:

有一个默认的日历应用程序。

它从下一个视图控制器开始,并且后退按钮已经存在,就像在此之前启动了其他一些视图控制器一样:

当你按下后退按钮时,你会得到下一个视图控制器:

他们是怎么做到的?

在我的应用程序中,我需要相同的逻辑(以最新或默认类别启动视图控制器,但用户可以按后退按钮选择不同类别)

【问题讨论】:

    标签: ios uiviewcontroller uinavigationbar uinavigationcontroller


    【解决方案1】:

    如果我要这样做,我将首先使用pushViewController(animated:) 将月份视图推送到导航堆栈,并在根视图控制器的viewWillAppear(animated:) 方法中使用animated: false。对用户来说,该日历已经在导航堆栈中深一层。

    所以,第一个控制器是年视图,然后月视图是第二个压入堆栈的控制器,但这一切都发生在用户看到任何视图之前。很简单吧?

    这里是the docs for UINavigationController,以防万一。

    【讨论】:

    • 我正在尝试使用show(controller, sender: self),但有动画。所以,是的,pushViewController(animated:) 看起来好多了。看来我必须在根视图控制器中使用一些布尔变量来指示第二个视图控制器已经启动并检查viewWillAppear(animated:) 中的添加条件。当第二个视图控制器处于活动状态时,根视图控制器不会死?
    • 您可以使用 Bool,也可以使用 navController.viewControllers.contains(yourViewController) 来查看控制器是否已经在数组中。
    【解决方案2】:

    我认为您想要的是在启动时推送一次视图控制器。一个简单的方法是对UINavigationController 进行子类化并将其分配给情节提要中的根导航控制器。然后只需在您的子类的viewWillAppear 方法中完成这项工作,因为这将在启动时仅调用一次。

    当然,如果你将推送代码放在第一个视图控制器的viewWillAppear 中,你也可以使用一个标志只加载下一个视图控制器一次来实现相同的结果。

    @interface MyNavigationController : UINavigationController
    
    @end
    
    @implementation MyNavigationController
    
    - (void)viewWillAppear:(BOOL)animated {
        [super viewWillAppear:animated];
    
        UIViewController *secondVC = [self.storyboard instantiateViewControllerWithIdentifier:@"secondVC"];
        [self pushViewController:secondVC animated:NO];
    }
    
    @end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-04
      相关资源
      最近更新 更多