通常情况下,我可以找到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.UIApplicationWillEnterForeground
and中添加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中触发通知事件。如果您正在寻找集中解决方案,这种分散的枪方法可能无效。