NSTimer
を使用してコードを実行するView Controllerがあります。
タイマーを一時停止できるように、アプリがバックグラウンドに移行するタイミングを検出する最良の方法は何ですか?
アプリがバックグラウンドになったときに関心があるクラスであれば、通知を受け取ることができます。これは、これらのクラスをAppDelegateと結合するための優れた代替手段です。
上記のクラスを初期化する場合:
[[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];
}
In 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) {
}
アプリケーションでAppDelegate (void)applicationDidEnterBackground:(UIApplication *)application
メソッドはiOSによって呼び出されます。そこでタイマーを停止できます。
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で可能な限り動的ディスパッチとObjective-Cセレクターを避けることを推奨していますが、これは依然としてこれを行う最も便利な方法です。
In Swift 4.1:
クロージャーバージョンを使用します。
var observer: NSObjectProtocol!
// inside init or viewDidLoad:
observer = NotificationCenter.default.addObserver(forName: .UIApplicationWillResignActive, object: nil, queue: nil) { _ in
print("willResignActive")
}
deinit {
NotificationCenter.default.removeObserver(observer)
}
addObserver
メソッドは、ある時点で削除する必要がある不透明なオブジェクトを返します。
スウィフト4:
init() {
NotificationCenter.default.addObserver(self,
selector: #selector(applicationWillResignActive),
name: NSNotification.Name.UIApplicationWillResignActive,
object: nil)
}
deinit {
NotificationCenter.default.removeObserver(self,
name: NSNotification.Name.UIApplicationWillResignActive,
object: nil)
}
@objc private func applicationWillResignActive() {
self.header.blur.effect = nil
}
アプリデリゲートの- (void)applicationWillResignActive:(UIApplication *)application
。他のオブジェクトのUIApplicationWillResignActiveNotification
通知に登録することもできます。
ただし、必ずしもタイマーを一時停止する必要はありません。何もしなければ、アプリはとにかくスリープ状態になり、コードを実行しません。おそらく、アクティブになったときにタイマーが作動します(もしそうなら)。何か特別なことをする必要がある場合は、「アクティブになった」デリゲートメソッドと通知も登録できます。
注意事項:バックグラウンドで通知されるようにコントローラーAを登録する場合、2番目のコントローラーBを押してBを表示している場合でも呼び出されることに注意してください:この動作が正しくない場合で登録/登録解除することをお勧めします
didAppear/WillDisappear。