2009-11-28 3 views
11

Ich habe eine iPhone-Anwendung mit Tab-Leiste und Navigations-Controller entwickelt.Wie kann ich den iPhone-Anwendungsstatus beibehalten, bevor die Anwendung beendet wird?

Es funktioniert jetzt gut.

Jetzt möchte ich, dass die Anwendung ihren Status vor dem Beenden speichert.

Angenommen, ich habe 6 Tabs und wenn ein eingehender Anruf kommt, sollte nach dem Neustart der App ich die Registerkarte ausgewählt, die zuletzt ausgewählt wurde.

Ich habe zu diesem Thema einige Fragen gesehen, aber ich bin mehr verwirrt, nachdem sie zu sehen,

kann mir jemand sagen, einen geraden Weg, dies zu tun?

Antwort

27

Es gibt keine "one size fits all", genaue Antwort auf diese Frage - die Implementierung des Speicherns des Anwendungsstatus hängt stark von der Struktur der Anwendung ab, so dass keine einzelne Lösung für Ihren speziellen Fall geeignet ist.

Es gibt einige allgemeine Tipps und Hinweise jedoch, dass auf dem richtigen Weg legen Sie sollten einen guten Zustand zu bewahren Lösung zu entwickeln:

  1. Sie werden in der Regel alle Operationen ausführen möchten Zustand speichern in applicationWillTerminate: in Ihrem App-Delegierten oder indem Sie in anderen Klassen auf hören.

  2. Look at NSUserDefaults.Look at NSUserDefaults. Sie können NSUserDefaults zum Speichern von Schlüssel/Wert-Paaren verwenden (ähnlich einem NSDictionary, obwohl Sie nur Objekte speichern können, die NSCoding in NSUserDefaults implementieren), die sich auf Präferenzen oder andere Informationen beziehen. Verwenden Sie NSUserDefaults, um Statusinformationen zu speichern. Ein Vorbehalt - Sie sollten NSUserDefaults nicht zum Speichern großer Datenmengen verwenden, da dies die Startzeit Ihrer Anwendung verlangsamen wird (da die Werte beim Start geladen werden).

  3. Spezifischer für Ihren Fall ... Wenn Sie nur die ausgewählte Registerkarte zwischen den Anwendungen beibehalten möchten, sollten Sie applicationWillTerminate: implementieren und NSUserDefaults zum Speichern des ausgewählten Registerindex verwenden. In Ihrer applicationDidFinishLaunching: -Implementierung überprüfen Sie dann, ob der Schlüssel NSUserDefaults vorhanden ist, und legen den ausgewählten Index des UITabBarControllers auf den gespeicherten Wert fest, sofern dieser vorhanden ist.

  4. Wenn Sie beispielsweise auch den Navigationsstapel der ausgewählten Registerkarte wiederherstellen möchten, müssen Sie genügend Informationen speichern, damit der Navigationsstapel genau rekonstruiert werden kann. Welche Informationen Sie in NSUserDefaults speichern sollten, ist im Allgemeinen schwer zu quantifizieren, da sie sehr spezifisch für die Struktur Ihrer Anwendung und die möglichen Iterationen der View-Controller-Hierarchie innerhalb des Navigationsstapels ist.

  5. Wenn Sie einen allgemeineren Navigationsstapel wiederherstellen müssen, einschließlich möglicherweise eingegebener Benutzerdaten, die beim Schließen der Anwendung nicht verloren gehen sollen (z. B. wenn der Benutzer einen neuen Datensatz erstellt) Ich würde vorschlagen, dass Sie Ihren Fokus weg von der Speicherung des Anwendungsstatus auf der Ebene der App-Delegierten verschieben und sich stattdessen darauf konzentrieren, dass Ihre View-Controller-Klassen auf warten und ihren eigenen spezifischen Status speichern. Sie müssen auch einen Mechanismus für die Verwendung der Informationen festlegen, die pro View-Controller bei Beendigung gespeichert werden, um die Navigationshierarchie wiederherzustellen. Dies ist eine komplexere Technik, die je nach Ihren Anforderungen möglicherweise nicht erforderlich ist.

Leider ist diese Antwort ein wenig nebulös, vor allem für die allgemeineren und komplexen Fällen, weil, wie ich es keine allgemeine Lösung für diese Frage ist zu bemerken, da es so stark auf Ihre Anwendungsstruktur abhängt.

Hier ist ein Beispiel für die Verwendung NSUserDefaults: http://robertcarlsen.net/2009/06/19/overly-simplistic-saving-state-in-of-for-iphone-847

+0

können Sie ein beliebiges Beispiel geben oder ein Tutorial Link – harshalb

+0

# 5 genau das, was ist, ich bin auf der Suche zu tun. In meinem Fall verwende ich Core Data. An der Basis des VC-Stacks können Sie ein vorhandenes "root" -verwaltetes Objekt auswählen oder ein neues erstellen. Dieses Objekt wird dann zur Bearbeitung an den nächsten VC übergeben. Darüber hinaus können Attribute ausgewählt/bearbeitet werden, also gibt es diese fortlaufende Voraussetzung. Da ich die Auswahl oben speichern kann (die Reihenfolge ändert sich zwischen den Läufen nicht), vermute ich, dass ich den Stapel von unten nach oben laufen und neu erstellen muss. Ich habe das Gefühl, dass ich hier NSCoding wirklich benutzen sollte, aber es scheint mit dieser Art von Restaurierung nicht vereinbar zu sein. Hmm. –

+0

Diese Bibliothek scheint hilfreich zu sein: https://github.com/enormego/EGOViewStackPersistence – pix0r

Verwandte Themen