检测应用程序何时进入我的视图的背景时,最好的方法是什么?

jfi*_*isk 71 nstimer ios

我有一个视图控制器,它使用一个NSTimer来执行一些代码.

什么是检测应用程序何时进入后台的最佳方法,以便我可以暂停计时器?

Jes*_*ack 163

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

初始化所述类时:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillResignActive:) name:UIApplicationWillResignActiveNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillTerminate:) name:UIApplicationWillTerminateNotification object:nil];
Run Code Online (Sandbox Code Playgroud)

回应通知

-(void)appWillResignActive:(NSNotification*)note
{

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

}
Run Code Online (Sandbox Code Playgroud)

  • 我不得不为这个代码做一个小修复:通过在`@ selector`里面的方法名称添加一个冒号,即用@selector(appWillResignActive:)替换`@selector(appWillResignActive)`(和`@selector(appWillTerminate:)`). (2认同)

Ash*_*k R 24

在Swift 4.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)
}

@objc func applicationWillResignActive(notification: NSNotification) {

}
Run Code Online (Sandbox Code Playgroud)

  • 来自 Apple 文档的 @StephanePaquet:“如果您的应用面向 iOS 9.0 及更高版本或 macOS 10.11 及更高版本,则您无需在它的 dealloc 方法中取消注册观察者。” :) (2认同)

Dam*_*ien 10

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

  • 您的应用还可以为UIApplicationDidEnterBackgroundNotification通知注册自己. (2认同)

Luk*_*uke 7

对于那些希望在Swift中执行此操作的人:

init:

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(applicationWillResignActive), name: UIApplicationWillResignActiveNotification, object: nil)
Run Code Online (Sandbox Code Playgroud)

deinit:

NSNotificationCenter.defaultCenter().removeObserver(self, name: UIApplicationWillResignActiveNotification, object: nil)
Run Code Online (Sandbox Code Playgroud)

回应通知:

dynamic private func applicationWillResignActive() {
    // Do things here
}
Run Code Online (Sandbox Code Playgroud)

Apple鼓励我们尽可能避免在Swift中使用动态调度和Objective-C选择器,但这仍然是最方便的方法.