所以 R 是根视图控制器(主菜单屏幕的种类),用户可以进入设置屏幕( S ),然后进入 A < / strong>或 B 查看控制器。
任务听起来很简单:当推送通知到来(并且用户点击它)时,应用程序必须向用户显示 A 视图控制器。
我可以想到两种方法来处理它。
首先是找出当前活动的视图控制器,然后使用如下逻辑:
如果 A 是当前可见的视图控制器,则无需执行任何操作。
如果当前 B ,则需要将其解除(因此路由到 S ),然后必须立即显示 A 。用户不得看到 S 即使在短时间内也会出现。
等等。
第二种方式解除/弹出所有内容,直到到达根 R 。然后按 S 并显示 A 。
我的想法是否有意义,你会建议什么?
特别是,我对
感兴趣答案 0 :(得分:0)
答案: -
1-要知道当前活动的viewController是什么,保留一个名为isAactive的共享userDefault布尔值,默认情况下它在viewDidLoad中为false,使其为true,在viewDidDisappear中再次为false,对于所有类似isBactive等等,随时随地查看
2-当B处于活动状态时发出通知时,请使用delagate或NotificationCenter通知viewController S(侦听器)如果处于活动状态则收集B并将A呈现为
dismiss(animated: false, completion: nil)
// present A make animation false
或如果你也把它从S推到A和B
所以如果它是B并且按A
,你将弹出当前的电流注意:你可以使用navigationController的setViewControllers方法在任何地方设置viewControllers数组,删除当前的viewControllers堆栈并用你设置的新数组替换它们,这将使你的头很高当前并实现目标
答案 1 :(得分: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)
}
}