什么是最好的方式来检测当我的观点进入应用程序的背景?

我有一个视图控制器使用NSTimer执行一些代码。

什么是最好的方式来检测应用程序是什么时候去的背景,所以我可以暂停计时器?

当应用程序进入后台时,您可以让任何感兴趣的类接收通知。 这是将这些类与AppDelegate耦合的一个很好的select。

当初始化所述类时:

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillResignActive:) name:UIApplicationWillResignActiveNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillTerminate:) name:UIApplicationWillTerminateNotification object:nil]; 

回应通知

 -(void)appWillResignActive:(NSNotification*)note { } -(void)appWillTerminate:(NSNotification*)note { [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillResignActiveNotification object:nil]; [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillTerminateNotification object:nil]; } 

在您的应用程序AppDelegate (void)applicationDidEnterBackground:(UIApplication *)application方法将由iOS调用。 你可以在那里停止你的计时器。

在Swift 3.0中

 override func viewDidLoad() { super.viewDidLoad() let app = UIApplication.shared //Register for the applicationWillResignActive anywhere in your app. NotificationCenter.default.addObserver(self, selector: #selector(ViewController.applicationWillResignActive(notification:)), name: NSNotification.Name.UIApplicationWillResignActive, object: app) } func applicationWillResignActive(notification: NSNotification) { } 

- (void)applicationWillResignActive:(UIApplication *)application在您的应用程序委托。 您也可以在其他对象上注册UIApplicationWillResignActiveNotification通知。

不过,您不一定需要暂停计时器。 如果你什么都不做,那么应用程序将无论如何都会进入hibernate状态,并且不会执行任何代码。 大概你的计时器会在你变得活跃时触发(如果你这样做的话)。 如果您需要做一些特殊的事情,那么您也可以注册“已成为活动”的委托方法和通知。

对于那些希望在Swift中这样做的人:

init

 NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(applicationWillResignActive), name: UIApplicationWillResignActiveNotification, object: nil) 

deinit

 NSNotificationCenter.defaultCenter().removeObserver(self, name: UIApplicationWillResignActiveNotification, object: nil) 

回应通知:

 dynamic private func applicationWillResignActive() { // Do things here } 

Apple鼓励我们在Swift中尽可能避免dynamic分派和Objective-Cselect器,但这仍然是最方便的方法。

尝试此SWIFT 3 :在AppDelegate文件中的事件didReceiveRemoteNotification。

  if application.applicationState == UIApplicationState.active { // TODO ACTIVE APP // Post notification NotificationCenter.default.post(name: Notification.Name("MY_NAME_NOTIFICATION"), object: nil, userInfo: userInfo) } else if application.applicationState == UIApplicationState.inactive { // TODO INACTIVE APP } else if application.applicationState == UIApplicationState.background { // TODO BACKGROUND APP } 

并在FirstViewController中添加OBSERVER

  override func viewDidLoad() { super.viewDidLoad() let nc = NotificationCenter.default // Note that default is now a property, not a method call nc.addObserver(self, selector: #selector(self.CallNotificationObserver), name:Notification.Name("MY_NAME_NOTIFICATION"), object: nil) }