web-dev-qa-db-ja.com

applicationDidBecomeActiveの処理-「View Controllerは、アプリがアクティブになったときにどのように応答できますか?」

メインのAppDelegate.mクラスにUIApplicationDelegateメソッドが定義されているapplicationDidBecomeActiveプロトコルがあります。

アプリケーションがバックグラウンドから戻ったときにメソッドを呼び出したいのですが、メソッドが別のView Controllerにあります。 applicationDidBecomeActiveメソッドで現在どのView Controllerが表示されているかを確認し、そのコントローラー内のメソッドを呼び出すにはどうすればよいですか?

168
Calvin

アプリケーション内のクラスは、アプリケーション内のさまざまな通知の「オブザーバー」になることができます。 View Controllerを作成(またはロード)するときに、UIApplicationDidBecomeActiveNotificationのオブザーバーとして登録し、その通知がアプリケーションに送信されたときに呼び出すメソッドを指定します。

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(someMethod:)
                                             name:UIApplicationDidBecomeActiveNotification object:nil];

自分の後をきれいにすることを忘れないでください!ビューが消えるときは、観察者としての自分自身を忘れないでください。

[[NSNotificationCenter defaultCenter] removeObserver:self 
                                                name:UIApplicationDidBecomeActiveNotification
                                              object:nil];

通知センター の詳細。

294
Reed Olsen

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
}
57
igrek

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.
}
16
Zorayr

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() {
}
6
Abhishek Jain

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)
}
3
CodeBender