メインのAppDelegate.mクラスにUIApplicationDelegate
メソッドが定義されているapplicationDidBecomeActive
プロトコルがあります。
アプリケーションがバックグラウンドから戻ったときにメソッドを呼び出したいのですが、メソッドが別のView Controllerにあります。 applicationDidBecomeActive
メソッドで現在どのView Controllerが表示されているかを確認し、そのコントローラー内のメソッドを呼び出すにはどうすればよいですか?
アプリケーション内のクラスは、アプリケーション内のさまざまな通知の「オブザーバー」になることができます。 View Controllerを作成(またはロード)するときに、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)
callback
@objc func applicationDidBecomeActive() {
// handle event
}
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.
}
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
を呼び出す代わりに、上記で作成した変数を呼び出すことです。これにより、無効なセレクタがクラッシュする状況を排除できます。
最後に、オブザーバーを削除します。
func removeObserver() {
NotificationCenter.default.removeObserver(self, name: .UIApplicationDidBecomeActive, object: nil)
}