2009-04-07 8 views
5

Ich habe eine andere Frage zum Wiederherstellen des Anwendungsstatus, auf dem iPhone. Einfache Daten (wie die ausgewählte Registerkarte) können in NSUserDefaults gespeichert werden, aber es ist nicht genug.Eine andere Frage über iPhone-Anwendung Status

Ich möchte den gesamten Zustand wiederherstellen, einschließlich der Navigation Controller (gehen Sie zum Sub-Sub-Sub-View-Controller).

Mein Problem ist, dass meine Anwendung in mehrere XIB-Dateien unterteilt ist, so dass zu Beginn alle View-Controller nicht instanziiert werden. Gibt es eine Möglichkeit, die Instanziierung aus einer XIB-Datei zu erzwingen?

(Ich habe keinen Code unter der Hand, aber ich kann versuchen, ein kleines Ende zu schreiben, wenn es nicht klar ist)

Vielen Dank.

Antwort

5

[viewController view] aufrufen dafür sorgen, dass eine Ansicht Controller gegeben XIB geladen ist, sobald es ist, Sie in der Regel einen seiner anderen Eigenschaften können

Hier ist, was ich zu tun neigen:

@class Record; // some model object--I assume it has an integer record ID 
@class DetailViewController; 

@interface RootViewController : UIViewController { 
    IBOutlet DetailViewController * detailController; 
} 

- (void)restore; 
... 
@end 

@implementation RootViewController 

// Note: all detailController showings--even ones from within 
// RootViewController--should go through this method. 
- (void)showRecord:(Record*)record animated:(BOOL)animated { 
    [self view]; // ensures detailController is loaded 

    [[NSUserDefaults standardUserDefaults] setInteger:record.recordID 
               forKey:@"record"]; 
    detailController.record = record; 

    [self.navigationController pushViewController:detailController 
             animated:animated]; 
} 

- (void)restore { 
    int recordID = [[NSUserDefaults standardUserDefaults] integerForKey:@"record"]; 

    if(recordID) { 
     Record * record = [Record recordWithID:recordID]; 
     [rootViewController showRecord:record animated:NO]; 
     // If DetailViewController has its own state to restore, add this here: 
     // [detailController restore]; 
    } 
} 
... 
- (void)viewDidAppear:(BOOL)animated { 
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"record"]; 
} 
@end 

@implementation MyAppDelegate 

- (void)applicationDidFinishLaunching:(UIApplication*)application { 
    ... 
    [rootViewController restore]; 
    ... 
} 
... 
@end 

Jede Ebene der Hierarchie Ansicht kümmert sich um seinen eigenen Zustand Einsparung, so dass die App Controller nicht über über alle möglichen Ansichten kennen und sie konnten, welche Aufträge sein.

+0

Es scheint die perfekte Lösung zu sein, ich werde das so schnell wie möglich testen. Vielen Dank ! –

+0

Das Laden aller Controller beim Start bricht das Konzept des langsamen Ladens, wodurch die Anwendungsstartzeit und die Speichernutzung erhöht werden. – Kornel

+0

Es werden nicht alle Controller geladen, da der Subcontroller nicht geladen wird, es sei denn, der Supercontroller verfügt über eine Datensatz-ID. –

4

Ich mache dies in meiner App, Litho Graph. Wenn Sie beim Beenden auf einer Seite sind, werden Sie beim nächsten Start wieder auf diese Seite zurückgesetzt. Es ist auch ziemlich einfach: In meiner Hauptansicht-Controller-ViewDidLoad-Implementierung suche ich nach dem zuletzt angesehenen Schlüssel in den Benutzereinstellungen. Wenn es nichts gibt, fahre ich wie gewohnt fort (und zeige eine Liste aller Seiten an). Wenn etwas passiert, öffne ich diese Seite (schiebe den neuen View-Controller auf den Navigations-Controller-Stack).

Das tatsächliche Laden der View-Controller ist sehr einfach: Ich instanziiere sie einfach. Jede meiner View-Controller-Klassen hat -init überschrieben, um initWithNibName: bundle: on super aufzurufen. Das Aufrufen von + alloc und -init zum Erstellen der View-Controller-Instanz reicht aus, um sie aus der entsprechenden .xib-Datei zu laden. Dann wird, wie oben beschrieben, schiebe ich es auf den Stapel der Navigation-Controller:

[self.navigationController pushViewController: controller animated: YES]; 

Sie dies tun können, so viele Schichten tief, wie es nötig ist, natürlich, aber bedenken Sie, dass Sie möchten, können Sie die Ansicht schieben Controller ohne Animation, wenn es mehrere Übergänge gibt; es wäre kontraproduktiv für den Benutzer durch mehrere Animationen warten zu müssen. (:

0

Sehen Sie sich den Beispielcode "DrilldownSave" von Äpfeln an. macht genau das, was Sie wollen