如何浏览应用程序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何浏览应用程序相关的知识,希望对你有一定的参考价值。
我有一个ios应用程序,它具有以下内部结构:
因此R是根视图控制器(一种主菜单屏幕),用户可以进入设置屏幕(S),然后进入A或B视图控制器。
任务听起来很简单:当推送通知到来(并且用户点击它)时,应用程序必须向用户显示A视图控制器。
我可以想到两种方法来处理它。
第一个是找出当前活动的视图控制器,然后使用如下逻辑:
如果A是当前可见的视图控制器,则不需要执行任何操作。
如果B是当前的,那么它需要被解除(因此路由到S)然后必须立即呈现A.并且用户不能看到S即使在短时间内出现。
等等。
第二种方式是解除/弹出所有东西,直到到达根R.然后推S并出现A.
我的想法是否有意义,你会建议什么?
特别是,我感兴趣
- 如何在给定时刻实现哪个视图控制器是“当前”
- 如何执行路由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)
}
}
以上是关于如何浏览应用程序的主要内容,如果未能解决你的问题,请参考以下文章