2016-07-13 4 views
6

Ich habe momentan Schwierigkeiten zu verstehen, was ich zum Speichern und Wiederherstellen meines App-Status verwenden soll.Speichern und Wiederherstellen von UINavigation Stacks zum erneuten Verbinden

Ich verwende ein Storyboard und ich habe einige ViewControllers, und ich möchte alle meine Navigationsstapel speichern, wenn die App beendet wird, um die gesamte Navigation wiederherzustellen, wenn der Benutzer die Anwendung neu startet.

Ich verwende eine UINavigationController mit einem anderen UINavigationController innerhalb es nur für Informationen.

Ich fand diese und diese über gelesen und über: https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/PreservingandRestoringState.html#//apple_ref/doc/uid/TP40007457-CH28-SW34

(Erforderlich) wollen Restaurierung Identifikatoren zu den View-Controller, deren Konfiguration Weisen Sie erhalten; Siehe Tagging View Controller für die Bewahrung.

(Erforderlich) Sag iOS, wie neue View-Controller-Objekte zum Zeitpunkt des Starts erstellt oder lokalisiert werden sollen. Weitere Informationen finden Sie unter Wiederherstellen von View Controllern zum Zeitpunkt des Starts.

Dann habe ich ein RestorationId auf alle meine Viewcontrollers, aber ich verstehe nicht, was ich für den zweiten Teil tun sollte, wenn ich hinzufügen viewControllerWithRestorationIdentifierPath Methoden, die ich nicht nach innen passieren.

Ich habe auch versucht die navigation.viewcontrollers in die NSUserDefaults zu speichern, um sie wieder zu verwenden, wenn der Benutzer mit dem Code der App neu starten:

+(NSArray *) getNavStatus 
{ 
    NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults]; 
    id objectSaved; 
    if((objectSaved = [preferences objectForKey:navStatusKey]) != nil) 
     return [NSKeyedUnarchiver unarchiveObjectWithData:objectSaved]; 
    else 
     return nil; 
} 

+(BOOL) saveNavStatus:(UINavigationController *) nav 
{ 
    NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults]; 

    NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:nav.viewControllers]; 
    [preferences setObject:encodedObject forKey:navStatusKey]; 

    // Save to disk 
    return [preferences synchronize]; 
} 

Aber wenn ich in den App-Apfel-Statistik zurück zu sagen, Ich, dass die Einschränkung nicht respektiert wird und dass die App abstürzt und dann, wenn ich die ViewControllers in den Stack meiner Navigation fügt es Absturz :)

Alle Tipps oder Hilfe wäre sehr geschätzt. Vielen Dank

+0

Haben Sie 'encodeRestorableStateWithCoder:' und 'decodeRestorableStateWithCoder:'? Sie können dieses Tutorial auch überprüfen. Es wird dir helfen. http://www.techotopia.com/index.php/An_iOS_6_iPhone_State_Preservation_and_Restoration_Tutorial –

+0

Ich habe jetzt kann ich etwas Wiederherstellung, aber wie ich sagte, ich möchte den gleichen Prozess nach dem Töten der Anwendung selbst, aber wenn der Benutzer es zu töten, die Die Wiederherstellung wird nicht bei den nächsten Starts gestartet. Gibt es eine Möglichkeit, sie zu erzwingen? –

+0

wie oben wiederherstellen controllers Zustand wird nicht funktionieren, während Sie die Anwendung von Stretch neu starten. Apples Standard-Wiederherstellung Navigationsstatus wird in diesem Fall nicht funktionieren, aber Sie können dasselbe mit dem Speichern dieses Benutzerstatus in der DB tun und während App zu diesem Zeitpunkt öffnet es durch manuelle Programmierung Logik anders als gibt es keine Lösung der oben genannten Problem, aber diese Logik ist nur arbeiten mit 3-4 Navigation drücken, wenn Sie 7-8 Navigation drücken, als es nicht funktioniert. – CodeChanger

Antwort

4

Haben Sie implementiert application:shouldRestoreApplicationState: und application: shouldSaveApplicationState: Methoden in Anwendung Delegate. Hoffe, dass der Schritt Schlag kann Ihnen helfen:

1. Set Restaurierung Identifikatoren

Wenn Restauration Kennungen zuweisen, denken Sie daran, dass alle übergeordneten Ansicht-Controller in der View-Controller-Hierarchie zu Restaurations Identifikatoren haben muss. Auch sind Navigation und TabBar ...

  • ein. Weisen Sie der Eigenschaft restorationIdentifier der Ansicht eine gültige Zeichenfolge zu.

  • b. Verwenden Sie die Ansicht von einem Ansichtscontroller, der ebenfalls über eine gültige Wiederherstellungskennung verfügt.

  • c. Ordnen Sie für Tabellensichten und Auflistungssichten eine Datenquelle zu, die das UIDataSourceModelAssociation-Protokoll annimmt.

-

2. tell application möchten Sie staatliche Preservation

Fügen Sie die beiden Methoden zur Anwendung delegate.m-Datei erforderlich, um sowohl Speicherung und Wiederherstellung von Anwendungszustand verwenden

-(BOOL)application:(UIApplication *)application shouldRestoreApplicationState:(NSCoder *)coder 
{ 
    return YES; 
} 

-(BOOL)application:(UIApplication *)application shouldSaveApplicationState:(NSCoder *)coder 
{ 
    return YES; 
} 

3. Schreiben und lesen Controller-Status

Ihr Preservation Controller muss das UIStateRestoring-Protokoll übernehmen und die Methoden dieses Protokolls verwenden, um seinen Status zu schreiben und zu lesen.

-(void)encodeRestorableStateWithCoder:(NSCoder *)coder 
    { 
     if (_textLabel.text.length > 0) { 
      [coder encodeObject:_textLabel.text forKey:@"labelText"]; 
     } 
     [super encodeRestorableStateWithCoder:coder]; 
    } 

    -(void)decodeRestorableStateWithCoder:(NSCoder *)coder 
    { 
     _textLabel.text = [coder decodeObjectForKey:@"labelText"]; 
     [super decodeRestorableStateWithCoder:coder]; 
    } 

4. Wiederherstellen Viewcontroller

viewControllerWithRestorationIdentifierPath implementieren: coder: Methode der Restauration Klasse zugeordnet, um den View-Controller abzurufen.

+ (nullable UIViewController *)viewControllerWithRestorationIdentifierPath:(NSArray *)identifierComponents coder:(NSCoder *)coder{ 
    ViewControllerThree * restoreVc; 
    UIStoryboard* storyBoard = [coder decodeObjectForKey:UIStateRestorationViewControllerStoryboardKey]; 
    if (storyBoard) { 
     restoreVc = (ViewControllerThree*)[storyBoard instantiateViewControllerWithIdentifier:@"ViewControllerThree"]; 
     restoreVc.restorationIdentifier = [identifierComponents lastObject]; 
     restoreVc.restorationClass = [ViewControllerThree class]; 
    } 
    return restoreVc; 
} 
+0

Das ist eigentlich ziemlich nützlich, aber es beantwortet nur die Hälfte meiner Frage. Denn ich kann dies nur verwenden, um aus Hintergrund-Apps, die getötet wurden, wiederherzustellen. Aber ich möchte, dass meine App dasselbe tut, nachdem ich sie getötet habe. Gibt es eine Möglichkeit, den Wiederherstellungsprozess programmatisch zu starten? –

+0

Sie können die App nicht selbst über den App-Switcher beenden, sonst funktioniert die Wiederherstellung des Zustands einfach nicht. – Stoull

Verwandte Themen