it-swarm.com.de

ApplicationDidBecomeActive - "Wie kann ein View Controller darauf reagieren, dass die App aktiv wird?"

Ich habe das Protokoll UIApplicationDelegate in meiner Hauptklasse AppDelegate.m, wobei die Methode applicationDidBecomeActive definiert ist.

Ich möchte eine Methode aufrufen, wenn die Anwendung aus dem Hintergrund zurückkehrt, aber die Methode befindet sich in einem anderen Ansichtscontroller. Wie kann ich überprüfen, welcher Ansichtscontroller derzeit in der applicationDidBecomeActive -Methode angezeigt wird, und dann eine Methode innerhalb dieses Controllers aufrufen?

168
Calvin

Jede Klasse in Ihrer Anwendung kann ein "Beobachter" für verschiedene Benachrichtigungen in der Anwendung werden. Wenn Sie Ihren Ansichtscontroller erstellen (oder laden), möchten Sie ihn als Beobachter für UIApplicationDidBecomeActiveNotification registrieren und angeben, welche Methode Sie aufrufen möchten, wenn diese Benachrichtigung an Ihre Anwendung gesendet wird.

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

Vergiss nicht, nach dir selbst aufzuräumen! Denken Sie daran, sich als Beobachter zu entfernen, wenn Ihre Sicht vergeht:

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

Weitere Informationen zum Notification Center .

294
Reed Olsen

Schnelles 3, 4-Äquivalent:

beobachter hinzufügen

NotificationCenter.default.addObserver(self,
    selector: #selector(applicationDidBecomeActive),
    name: .UIApplicationDidBecomeActive, // UIApplication.didBecomeActiveNotification for Swift 4.2+
    object: nil)

beobachter entfernen

NotificationCenter.default.removeObserver(self,
    name: .UIApplicationDidBecomeActive, // UIApplication.didBecomeActiveNotification for Swift 4.2+
    object: nil)

callback

@objc func applicationDidBecomeActive() {
    // handle event
}
57
igrek

Swift 2-Äquivalent:

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

Beobachter hinzufügen-

NotificationCenter.default.addObserver(self, selector: #selector(handleEvent), name: UIApplication.didBecomeActiveNotification, object: nil)

Beobachter entfernen-

NotificationCenter.default.removeObserver(self, name: UIApplication.didBecomeActiveNotification, object: nil)

Ereignis behandeln-

@objc func handleEvent() {
}
6
Abhishek Jain

Mit Swift 4, Apple warnt über einen neuen Compiler, dass wir die Verwendung von #selector In diesem Szenario vermeiden. Das Folgende ist einiges Sicherer Weg, dies zu erreichen:

Erstellen Sie zunächst eine Lazy Var, die von der Benachrichtigung verwendet werden kann:

lazy var didBecomeActive: (Notification) -> Void = { [weak self] _ in
    // Do stuff
} 

Wenn die eigentliche Benachrichtigung enthalten sein soll, ersetzen Sie einfach den _ Durch notification.

Als Nächstes richten wir die Benachrichtigung ein, damit die App aktiv wird.

func setupObserver() {
    _ = NotificationCenter.default.addObserver(forName: .UIApplicationDidBecomeActive,
                                               object: nil,
                                               queue:.main,
                                               using: didBecomeActive)
}

Die große Änderung hier ist, dass wir anstelle eines #selector Jetzt die oben erstellte Variable aufrufen. Dies kann Situationen beseitigen, in denen es zu ungültigen Abstürzen bei der Auswahl kommt.

Schließlich entfernen wir den Beobachter.

func removeObserver() {
    NotificationCenter.default.removeObserver(self, name: .UIApplicationDidBecomeActive, object: nil)
}
3
CodeBender