applicationDidBecomeActiveの処理-「ビューコントローラーがアプリがアクティブになるのにどのように応答できるか」


179

私が持っているUIApplicationDelegateと、私のメインAppDelegate.mクラスでプロトコルをapplicationDidBecomeActive定義した方法。

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

回答:


304

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

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

自分で片付けるのをお忘れなく!ビューが消えるときは、オブザーバーとして自分自身を削除することを忘れないでください。

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

通知センターに関する詳細情報。


優れた。の使用を考えていませんでしたNSNotificationCenter。ありがとうございました!
カルバン

3
そのコード行のタイプミス( 'name'がない):[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(someMethod :) name:UIApplicationDidBecomeActiveNotification object:nil];
Johnus

3
リードの答えに追加するには、呼び出されるメソッド(この例ではsomeMethod)はNSNotificationパラメーターを受け入れる必要があります。そのため、someMethodのメソッドシグネチャは-(void)someMethod:(NSNotification *)notification {//ここで何かを行う}
Aaron

2
@Aaronできますが、必須ではありません。しかし、それは素晴らしい洞察です。ありがとう!
Reed Olsen

素晴らしい!NSTimerのインスタンスを無効化/再作成するには、ビューコントローラーやその他のNSTimerを担当する他のオブジェクトで、なんと素晴らしい方法でしょうか。大好きです!
idStar 2012年

68

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
}

2
これはどこに呼びますか?

1
@ user8169082では、通知の受信を開始する必要がある場所にオブザーバーを追加します。viewDidLoadまたは上にそれviewWillAppear:animatedを追加することができます。また、通知が不要になった場合、またはオブザーバーインスタンスがdeinitメソッドで割り当て解除される場合は、オブザーバーを削除できます
igrek

2
swift 4.2私が使用しています:NotificationCenter.default.addObserver(self、selector:#selector(applicationDidBecomeActive(notification :))、name:UIApplication.didBecomeActiveNotification、object:nil)
Brian

16

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

removeObserverSwift に置くのに最適な場所:deinitメソッド。
Enrico Susatyo

一般に、deinitで自己にアクセスすることはお勧めしません。この時点で、自己は完全に割り当てられ、割り当て解除されている間にある
Zorayr

1
次に、Observerをどこで削除しますか?
Enrico Susatyo 2016年

2
@EnricoSusatyo正しくないので、無視してかまいません。deinitのオーバーライドは問題ありません:「インスタンスはdeinitializerが呼び出されるまで割り当て解除されないため、deinitializerは呼び出されたインスタンスのすべてのプロパティにアクセスでき、それらのプロパティに基づいて動作を変更できます(たとえば、閉じられる必要があるファイル)。」deinitの呼び出しは問題ありません
Dan Rosenstark、2016年

7

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

5

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

1
#selector宣言されたメソッドを呼び出すことができ@objcスウィフト4の属性
AnBisw

1
オブザーバーを追加するときに自分が割り当てられなかったremoveObserver(selfため、使用するのは正しくありません。あなたはそれからlet observer = NotificationCenter.default.addObserverremoveObserver(observer
Yan Kalbaska

@CodeBenderに感謝その関数はまだ知らなかったので、(最終的に)を削除し@objcます。しかし、それを試してみると、コンソールに警告が表示されます(Xcode 11.3.1(11C504)、Swift 13.3):BackgroundTaskを終了できません:識別子を持つバックグラウンドタスクが存在しません。オブザーバーを変数にNSObjectProtocolとして保存しても、
パルメ

@objcバリアントを使用すると、警告も表示されます。
パルメ

3

スウィフト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
    }

0

結合方法:

import Combine

var cancellables = Set<AnyCancellable>()
NotificationCenter.default.publisher(for: UIApplication.didBecomeActiveNotification)
    .sink { notification in
            // do stuff
    }.store(in: &cancellables)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.