2010-09-03 5 views
146

Ich habe das Protokoll UIApplicationDelegate in meiner Hauptklasse AppDelegate.m mit der applicationDidBecomeActive-Methode definiert.Handling applicationDidBecomeActive - "Wie kann ein View-Controller reagieren, wenn die App aktiv wird?"

Ich möchte eine Methode aufrufen, wenn die Anwendung vom Hintergrund zurückkehrt, aber die Methode ist in einem anderen View-Controller. Wie kann ich überprüfen, welcher Ansichts-Controller gerade in der applicationDidBecomeActive-Methode angezeigt wird, und dann eine Methode in diesem Controller aufrufen?

Antwort

275

Jede Klasse in Ihrer Anwendung kann ein "Beobachter" für verschiedene Benachrichtigungen in der Anwendung werden. Wenn Sie Ihren View-Controller erstellen (oder laden), möchten Sie ihn als Beobachter für die 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]; 

Vergessen Sie nicht, sich selbst aufzuräumen! Denken Sie daran, sich als Beobachter zu entfernen, wenn Ihre Sicht geht weg:

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

Mehr Informationen über die Notification Center.

+0

Ausgezeichnet. Ich habe nicht daran gedacht, 'NSNotificationCenter' zu verwenden. Vielen Dank! – Calvin

+3

Nur ein Tippfehler in dieser Codezeile (fehlender 'Name'): [[NSNotificationCenter defaultCenter] addObserver: self-Selektor: @selector (someMethod :) Name: UIApplicationDidBecomeActiveNotification object: nil]; – Johnus

+0

@Johnus - danke für den Fang. Meine Antwort wurde aktualisiert. –

15

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

Der beste Ort, um 'removeObserver' in Swift:' deinit' Methode zu platzieren. –

+0

Im Allgemeinen wird der Zugriff auf sich selbst in Deinit nicht empfohlen; An diesem Punkt ist das self zwischen dem vollständigen Zuweisen und der Freigabe – Zorayr

+0

Wo würdest du removeObserver dann entfernen? –

32

Swift 3, 4-Äquivalent:

Zugabe Beobachter

NotificationCenter.default.addObserver(self, 
    selector: #selector(applicationDidBecomeActive), 
    name: .UIApplicationDidBecomeActive, 
    object: nil) 

Entfernen Beobachter

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

Rückruf

@objc func applicationDidBecomeActive() { 
    // handle event 
} 
+0

wo soll ich das nennen? –

+0

@ user8169082, Sie fügen einen Beobachter hinzu, wo immer Sie Benachrichtigungen erhalten möchten. Sie könnten es zum Beispiel auf 'viewDidLoad' oder' viewWillAppear: animated' hinzufügen. Und Sie können einen Beobachter entfernen, wenn Sie keine Benachrichtigungen mehr benötigen oder wenn Ihre Beobachterinstanz in der Deinit-Methode aufgehoben wird – igrek

1

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 ein fauler 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 richten wir die Benachrichtigung ein, die beobachtet werden soll, wenn die App aktiv wird.

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

Die große Veränderung ist hier, dass stattdessen ein #selector zu nennen, wir die var oben erstellt jetzt nennen. Dies kann Situationen eliminieren, in denen ungültige Selektorabstürze auftreten.

Schließlich entfernen wir den Beobachter.

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