如何浏览应用

时间:2017-12-25 20:51:40

标签: ios uiviewcontroller uinavigationcontroller

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

所以 R 是根视图控制器(主菜单屏幕的种类),用户可以进入设置屏幕( S ),然后进入 A < / strong>或 B 查看控制器。

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

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

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

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

如果当前 B ,则需要将其解除(因此路由到 S ),然后必须立即显示 A 。用户不得看到 S 即使在短时间内也会出现。

等等。

第二种方式解除/弹出所有内容,直到到达根 R 。然后按 S 并显示 A

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

特别是,我对

感兴趣
  1. 如何实现哪个视图控制器是&#34;当前&#34;在特定的时刻
  2. 如何快速执行路由 B - &gt;解雇 - &gt; S - &gt;快速显示 A 而不显示 S 即可。

2 个答案:

答案 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)
    }
}