如何浏览应用程序

问题描述 投票:1回答:2

我有一个iOS应用程序,它具有以下内部结构:enter image description here

因此R是根视图控制器(一种主菜单屏幕),用户可以进入设置屏幕(S),然后进入A或B视图控制器。

任务听起来很简单:当推送通知到来(并且用户点击它)时,应用程序必须向用户显示A视图控制器。

我可以想到两种方法来处理它。

第一个是找出当前活动的视图控制器,然后使用如下逻辑:

如果A是当前可见的视图控制器,则不需要执行任何操作。

如果B是当前的,那么它需要被解除(因此路由到S)然后必须立即呈现A.并且用户不能看到S即使在短时间内出现。

等等。

第二种方式是解除/弹出所有东西,直到到达根R.然后推S并出现A.

我的想法是否有意义,你会建议什么?

特别是,我感兴趣

  1. 如何在给定时刻实现哪个视图控制器是“当前”
  2. 如何执行路由B-> dismiss-> S->快速显示A而不显示S.
ios uiviewcontroller uinavigationcontroller
2个回答
0
投票

答案: -

1-要知道当前活动的viewController是什么,保持一个名为isAactive的共享userDefault布尔值,默认情况下它在viewDidLoad中为false,并且在viewDidDisappear中再次为false,对于所有类似isBactive等等,请在任何地方检查它

2-当B处于活动状态时发出通知时,使用委托或NotificationCenter通知viewController S(监听器)关闭B如果处于活动状态并且呈现A类似于

  dismiss(animated: false, completion: nil)

  // present A make animation false

或者如果你也把它从S推到A和B.

所以如果它是B并且按A,你将弹出电流

注意:你可以使用navigationController的setViewControllers方法在任何地方设置viewControllers数组,删除当前的viewControllers堆栈并用你设置的新数组替换它们,这将使你的头脑保持高水平,不会检查当前并实现目标


0
投票

在接收我们的日历活动通知时,我会这样做。我否定了这个电话,所以它只会在用户/不在/日历视图上时触发。此外,这是对现有导航堆栈的推动,这可能不是您想要的行为。如果要重建导航堆栈,则需要在推送之前调用navController.popToRootViewController(animated: false)

AppDelegate中

func pushCalendarView() {

    let navController = self.window?.rootViewController as! UINavigationController

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let calendarView = storyboard.instantiateViewController(withIdentifier: "CalendarView") as! CalendarViewController

    // !negated
    if let controller = navController.visibleViewController, !controller.isKind(of: CalendarViewController.self) {

        navController.pushViewController(calendarView, animated: true)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.