2017-02-13 1 views
0

Ich brauche Code, um jedes Mal zu starten, wenn die App geöffnet wird, einschließlich, wenn es nur ausgesetzt wurde (Benutzer schlug die Home-Taste und kehrte dann zur App zurück).Code bei jedem Öffnen der App ausführen - besser?

Ich weiß bereits, dass ViewDidLoad nur auf die erste VC-Last geladen wird, so dass das, was ich brauche, nicht tut. Und viewWillAppear/viewDidAppear tut es auch nicht. Dieser SO-Thread hat an answer, aber es ist vor sechs Jahren und ich liebe die Antwort nicht. Im Wesentlichen heißt es, einen Beobachter zu schaffen. Dies scheint jedoch eine Verschwendung von Ressourcen zu sein, und Beobachter erstellen Referenzschleifen, die die Dinge im Gedächtnis behalten.

Wenn niemand mir eine bessere Lösung gibt, könnte ich "applicationDidBecomeActive" in der AppDelegate versuchen, aber ich versuche, meine appDelegate nicht mit ViewController-Code laden.

Meine Frage ist, in den sechs Jahren, seit dieser SO Thread beantwortet wurde, erlaubt Swift/iOS10 jetzt eine sauberere Lösung?

+0

Es ist eine gute Idee, den Code eines View-Controllers nicht auf AppDelegate zu setzen, aber es ist völlig in Ordnung, seine Methoden an einen View-Controller weiterzuleiten: https://en.wikipedia.org/wiki/Forwarding_(object- oriented_programming). – user3581248

+0

Beachten Sie diese https://developer.apple.com/reference/uikit/uiapplicationdidbeactivenotification – ogres

Antwort

5

Wenn Sie nicht möchten, dass NSNotificationCenter als machen globales Objekt Ihren Viewcontroller in AppDelegate

und setzen Code in applicationDidBecomeActive mit Ihrem Viewcontroller Objekt

Da applicationDidBecomeActive Anrufe verwenden, Jedes Mal, wenn Sie Ihre Anwendung starten und wenn Sie auf die Home-Taste drücken und aus dem Hintergrund kamen, müssen Sie Ihren Code nicht in viewWillAppear schreiben.

+0

Danke, es hat funktioniert !. Habe meinen Tag gerettet –

0

Soweit ich nach zusätzlicher Forschung sagen kann, gibt es seit diesem Posten vor sechs Jahren keinen neuen Weg. Allerdings ist die applicationDidBecomeActive Ansatz funktioniert gut:

func applicationDidBecomeActive(_ application: UIApplication) { 
    guard let rvc = self.window?.rootViewController as? firstVCName else { return } 
    rvc.nameOfMethodYouWantToCall() 
} 

Die oben einen Verweis auf die bestehenden VC bekommt (anstatt eine neue Instanz erstellen). Dann ruft es die Methode auf, ohne die appDelegate mit Code laden zu müssen. Sehr einfach und effizient.

Ich habe das getestet und es ist genau das, was ich brauchte, Code, der jedes Mal ausgeführt wird, wenn die App geöffnet wird. Es ist sehr konsistent.

Verwandte Themen