如何浏览应用程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何浏览应用程序相关的知识,希望对你有一定的参考价值。

我有一个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.
答案

答案: -

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堆栈并用你设置的新数组替换它们,这将使你的头脑保持高水平,不会检查当前并实现目标

另一答案

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

以上是关于如何浏览应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何在android tv中使用像netflix这样的浏览片段制作侧边菜单?

如何减少两行浏览片段之间的距离

如何在活动和浏览器片段之间传递值? [复制]

如何像浏览器一样在 Java 中组合 URL 片段?

十条实用的jQuery代码片段

兼容ie8,firefox,chrome浏览器的代码片段