回答:
アプリケーションのどのクラスも、アプリケーションのさまざまな通知の「オブザーバー」になることができます。ビューコントローラーを作成(またはロード)するときは、それをのオブザーバーとして登録しUIApplicationDidBecomeActiveNotification
、その通知がアプリケーションに送信されたときに呼び出すメソッドを指定します。
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(someMethod:)
name:UIApplicationDidBecomeActiveNotification object:nil];
自分で片付けるのをお忘れなく!ビューが消えるときは、オブザーバーとして自分自身を削除することを忘れないでください。
[[NSNotificationCenter defaultCenter] removeObserver:self
name:UIApplicationDidBecomeActiveNotification
object:nil];
通知センターに関する詳細情報。
Swift 3、4相当:
オブザーバーを追加する
NotificationCenter.default.addObserver(self,
selector: #selector(applicationDidBecomeActive),
name: .UIApplicationDidBecomeActive, // UIApplication.didBecomeActiveNotification for swift 4.2+
object: nil)
オブザーバーの削除
NotificationCenter.default.removeObserver(self,
name: .UIApplicationDidBecomeActive, // UIApplication.didBecomeActiveNotification for swift 4.2+
object: nil)
折り返し電話
@objc func applicationDidBecomeActive() {
// handle event
}
viewDidLoad
または上にそれviewWillAppear:animated
を追加することができます。また、通知が不要になった場合、またはオブザーバーインスタンスがdeinitメソッドで割り当て解除される場合は、オブザーバーを削除できます
Swift 2相当:
let notificationCenter = NSNotificationCenter.defaultCenter()
// Add observer:
notificationCenter.addObserver(self,
selector:Selector("applicationWillResignActiveNotification"),
name:UIApplicationWillResignActiveNotification,
object:nil)
// Remove observer:
notificationCenter.removeObserver(self,
name:UIApplicationWillResignActiveNotification,
object:nil)
// Remove all observer for all notifications:
notificationCenter.removeObserver(self)
// Callback:
func applicationWillResignActiveNotification() {
// Handle application will resign notification event.
}
removeObserver
Swift に置くのに最適な場所:deinit
メソッド。
Swift 4.2
オブザーバーを追加
NotificationCenter.default.addObserver(self, selector: #selector(handleEvent), name: UIApplication.didBecomeActiveNotification, object: nil)
オブザーバーを削除する
NotificationCenter.default.removeObserver(self, name: UIApplication.didBecomeActiveNotification, object: nil)
イベントを処理する
@objc func handleEvent() {
}
Swift 4では、Appleは新しいコンパイラの警告を介して#selector
、このシナリオでの使用を避けるようにアドバイスしています。以下は、これを実現するより安全な方法です。
最初に、通知で使用できるレイジー変数を作成します。
lazy var didBecomeActive: (Notification) -> Void = { [weak self] _ in
// Do stuff
}
実際の通知を含める必要がある場合は、をに置き換え_
てくださいnotification
。
次に、アプリがアクティブになるのを監視する通知を設定します。
func setupObserver() {
_ = NotificationCenter.default.addObserver(forName: .UIApplicationDidBecomeActive,
object: nil,
queue:.main,
using: didBecomeActive)
}
ここでの大きな変更は、を呼び出す代わりに、#selector
上記で作成したvarを呼び出すことです。これにより、無効なセレクターがクラッシュする状況を排除できます。
最後に、オブザーバーを削除します。
func removeObserver() {
NotificationCenter.default.removeObserver(self, name: .UIApplicationDidBecomeActive, object: nil)
}
#selector
宣言されたメソッドを呼び出すことができ@objc
スウィフト4の属性
removeObserver(self
ため、使用するのは正しくありません。あなたはそれからlet observer = NotificationCenter.default.addObserver
removeObserver(observer
@objc
ます。しかし、それを試してみると、コンソールに警告が表示されます(Xcode 11.3.1(11C504)、Swift 13.3):BackgroundTaskを終了できません:識別子を持つバックグラウンドタスクが存在しません。オブザーバーを変数にNSObjectProtocolとして保存しても、
@objc
バリアントを使用すると、警告も表示されます。
スウィフト5
fileprivate func addObservers() {
NotificationCenter.default.addObserver(self,
selector: #selector(applicationDidBecomeActive),
name: UIApplication.didBecomeActiveNotification,
object: nil)
}
fileprivate func removeObservers() {
NotificationCenter.default.removeObserver(self, name: UIApplication.didBecomeActiveNotification, object: nil)
}
@objc fileprivate func applicationDidBecomeActive() {
// here do your work
}
NSNotificationCenter
。ありがとうございました!