当应用程序进入前台时,哪个View Controller处于活动状态?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当应用程序进入前台时,哪个View Controller处于活动状态?相关的知识,希望对你有一定的参考价值。

通常情况下,我可以找到View Controller出现的时间

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
}

如果用户按下主页按钮或由于某些其他原因应用程序转到后台然后返回到前台,则不会调用此方法。要了解应用程序何时到达前台,我可以将观察者添加到通知中心。

class FirstViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        NotificationCenter.default.addObserver(self, selector: #selector(appWillEnterForeground), name: NSNotification.Name.UIApplicationWillEnterForeground, object: nil)
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        print("FirstViewController")
    }

    @objc func appWillEnterForeground() {
        print("app in foreground")
    }
}

但是,我的问题是我有一个标签式应用程序,我想知道当应用程序回到前台时哪个View Controller处于活动状态。通知中心只发送一般消息。即使我在第一个选项卡中设置通知观察者,当应用程序进入后台时,它也可以在任何选项卡上。

答案

NSNotification.Name.UIApplicationWillEnterForeground是通知中心发出的通知。显然,这与任何特定的VC无关。你可以做的是,

@objc func appWillEnterForeground() {
    if self.viewIfLoaded?.window != nil {
        // viewController is visible
    }
}

虽然应用程序进入前台的通知被触发到每个viewController观察它,但只有当前加载和可见的VC将在if条件执行时具有其代码。这使您可以控制当前可见的VC。

编辑1:

所有想要弄清楚的是TabBarController导航堆栈中的顶级ViewController当app来到foreGround时,你可以只在NSNotification.Name.UIApplicationWillEnterForegroundand中添加UITabBarController的观察者

@objc func appWillEnterForeground() {
    var vc : UIViewController = tabBarController.viewControllers![tabBarController.selectedIndex]
    while vc.presentedViewController != nil || self.childViewControllers.count != 0 {
        if vc.presentedViewController != nil {
            vc = vc.presentedViewController!
        }
        else {
            vc = vc.childViewControllers.last!
        }
    }
    print("\(vc) should be the top most vc")
}
另一答案

使用Notification Observer和appWillEnterForeground()或在选项卡控制器下的所有视图控制器中从观察者触发的任何事件。因此,无论您回到哪个视图控制器,都会在该特定VC中触发通知事件。如果您正在寻找集中解决方案,这种分散的枪方法可能无效。

以上是关于当应用程序进入前台时,哪个View Controller处于活动状态?的主要内容,如果未能解决你的问题,请参考以下文章

当应用程序进入前台时检测远程通知

当应用程序从后台进入前台时,MPMoviePlayerController 黑屏

当应用程序从后台进入前台时,onBackPress() 不起作用

当应用程序进入前台时,如何重新启动基于块的动画?

当 iphone 应用程序进入后台或前台状态时,如何保存数据?

Android需要事件前台和后台