applicationDidBecomeActive Handhabung - „Wie kann ein View-Controller reagieren auf die App aktiv zu werden?“
-
30-09-2019 - |
Frage
Ich habe das UIApplicationDelegate
Protokoll in meinem Haupt AppDelegate.m Klasse, mit der applicationDidBecomeActive
Methode definiert.
Ich möchte eine Methode aufrufen, wenn die Anwendung kehrt aus dem Hintergrund, aber die Methode in einem anderen View-Controller ist. Wie kann ich zur Zeit des View-Controller überprüfen ist in dem applicationDidBecomeActive
Verfahren zeigt und dann innerhalb dieses Controller einen Aufruf eine Methode machen?
Lösung
Jede Klasse in Ihrer Anwendung kann für verschiedene Meldungen in der Anwendung ein „Beobachter“ werden. Wenn Sie (oder Last) Ihre View-Controller erstellen, werden Sie es als Beobachter registrieren möchten für die UIApplicationDidBecomeActiveNotification
und angeben, welche Methode, die Sie aufrufen möchten, wenn diese Benachrichtigung an die Anwendung gesendet wird.
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(someMethod:)
name:UIApplicationDidBecomeActiveNotification object:nil];
Vergessen Sie nicht, sich selbst zu reinigen! Denken Sie daran, sich als Beobachter zu entfernen, wenn Sie Ihre Ansicht weggeht:
[[NSNotificationCenter defaultCenter] removeObserver:self
name:UIApplicationDidBecomeActiveNotification
object:nil];
Weitere Informationen über die Notification Center .
Andere Tipps
Swift 3, 4-äquivalent:
Hinzufügen Beobachter
NotificationCenter.default.addObserver(self,
selector: #selector(applicationDidBecomeActive),
name: .UIApplicationDidBecomeActive, // UIApplication.didBecomeActiveNotification for swift 4.2+
object: nil)
Entfernen Beobachter
NotificationCenter.default.removeObserver(self,
name: .UIApplicationDidBecomeActive, // UIApplication.didBecomeActiveNotification for swift 4.2+
object: nil)
Rückruf
@objc func applicationDidBecomeActive() {
// handle event
}
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.
}
Swift 4.2
Add Beobachter -
NotificationCenter.default.addObserver(self, selector: #selector(handleEvent), name: UIApplication.didBecomeActiveNotification, object: nil)
Remove Beobachter -
NotificationCenter.default.removeObserver(self, name: UIApplication.didBecomeActiveNotification, object: nil)
Handle Ereignis -
@objc func handleEvent() {
}
Mit Swift 4, rät Apple-über eine neue Compiler-Warnung, dass wir die Verwendung von #selector
in diesem Szenario zu vermeiden. Im Folgenden ist eine viel sicherere Weg dies zu tun:
Zuerst einen faulen var erstellen, die von der Anmeldung verwendet werden können:
lazy var didBecomeActive: (Notification) -> Void = { [weak self] _ in
// Do stuff
}
Wenn Sie die tatsächliche Anmeldung erforderlich enthalten sein, ersetzen Sie einfach den _
mit notification
.
Als nächstes einrichten wir die Benachrichtigung für die App zu beobachten, aktiv zu werden.
func setupObserver() {
_ = NotificationCenter.default.addObserver(forName: .UIApplicationDidBecomeActive,
object: nil,
queue:.main,
using: didBecomeActive)
}
Die große Veränderung ist hier, dass stattdessen eine #selector
aufzurufen, jetzt haben wir die var oben erstellt nennen. Dies kann Situationen beseitigen, in denen Sie ungültige Wähler Abstürze erhalten.
Schließlich haben wir die Beobachter entfernen.
func removeObserver() {
NotificationCenter.default.removeObserver(self, name: .UIApplicationDidBecomeActive, object: nil)
}