Ich habe das UIApplicationDelegate
Protokoll in meiner Hauptklasse AppDelegate.m mit der applicationDidBecomeActive
definierten Methode.
Ich möchte eine Methode aufrufen, wenn die Anwendung aus dem Hintergrund zurückkehrt, die Methode sich jedoch in einem anderen Ansichtscontroller befindet. Wie kann ich überprüfen, welcher View-Controller derzeit in der applicationDidBecomeActive
Methode angezeigt wird, und dann eine Methode in diesem Controller aufrufen?
NSNotificationCenter
. Danke dir!Swift 3, 4 Äquivalent:
Beobachter hinzufügen
Beobachter entfernen
zurückrufen
quelle
viewDidLoad
oderviewWillAppear:animated
zum Beispiel. Und Sie können einen Beobachter entfernen, wenn Sie keine Benachrichtigungen mehr benötigen oder wenn Ihre Beobachterinstanz in der Deinit-Methode freigegeben wirdSwift 2-Äquivalent :
quelle
removeObserver
Swift:deinit
Methode.Swift 4.2
Beobachter hinzufügen-
Beobachter entfernen-
Ereignis behandeln-
quelle
Mit Swift 4 weist Apple über eine neue Compiler-Warnung darauf hin, dass wir die Verwendung
#selector
in diesem Szenario vermeiden . Folgendes ist viel sicherer, um dies zu erreichen:Erstellen Sie zunächst eine faule Variable, die von der Benachrichtigung verwendet werden kann:
Wenn Sie die tatsächliche Meldung enthalten erfordern werden, ersetzen Sie einfach die
_
mitnotification
.Als Nächstes richten wir die Benachrichtigung ein, um zu beobachten, ob die App aktiv wird.
Die große Änderung hier ist, dass
#selector
wir anstelle von a jetzt die oben erstellte var aufrufen. Dies kann Situationen beseitigen, in denen ungültige Selektorabstürze auftreten.Schließlich entfernen wir den Beobachter.
quelle
#selector
kann eine Methode aufrufen,@objc
die in Swift 4 als Attribut deklariert ist.removeObserver(self
da beim Hinzufügen eines Beobachters kein Selbst zugewiesen wurde. Sie solltenlet observer = NotificationCenter.default.addObserver
dannremoveObserver(observer
@objc
. Wenn ich es jedoch versuche, wird in der Konsole eine Warnung angezeigt (Xcode 11.3.1 (11C504), Swift 13.3): BackgroundTask kann nicht beendet werden: Es gibt keine Hintergrundaufgabe mit der Kennung. Auch wenn ich den Beobachter in einer Variablen als NSObjectProtocol speichere.@objc
Variante benutze .Swift 5
quelle
Der kombinierte Weg:
quelle