2016-07-13 15 views
6

W tej chwili trudno jest mi zrozumieć, co powinienem zrobić, aby zapisać i przywrócić stan mojej aplikacji.Zapisywanie i przywracanie stosów UINavigation w celu ponownego połączenia

Używam scenorysu i mam sporo kontrolerów ViewController i chcę zapisać wszystkie moje stosy nawigacyjne po zakończeniu aplikacji, aby móc przywrócić całą nawigację po ponownym uruchomieniu aplikacji przez użytkownika.

Używam UINavigationController z innym UINavigationController wewnątrz to tylko dla informacji.

znalazłem to i przeczytać w kółko: https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/PreservingandRestoringState.html#//apple_ref/doc/uid/TP40007457-CH28-SW34

(Wymagane) Przypisanie identyfikatorów przywrócenie do kontrolerów widoku, którego konfigurację chcesz zachować; zobacz Oznaczanie kontrolerów widoku w celu zachowania.

(Wymagane) Poinformuj iOS, jak utworzyć lub zlokalizować nowe obiekty kontrolera widoku w czasie uruchamiania; zobacz Przywracanie kontrolerów widoku w Czas uruchomienia.

Potem dodał RestorationId na wszystkich moich ViewControllers ale ja nie rozumiem, co należy zrobić dla drugiej części, co po dodaniu viewControllerWithRestorationIdentifierPath metody nie zdam wewnątrz.

Próbowałem też zapisać navigation.viewcontrollers do NSUserDefaults aby wykorzystać je ponownie, gdy użytkownik ponownie uruchomić aplikację przy użyciu kodu:

+(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]; 
} 

Ale kiedy wrócę w statystykach aplikacja Apple powiedzieć mnie, że ograniczenie nie jest przestrzegane i aplikacja się zawiesi, a kiedy dodam viewControllers w stosie mojej nawigacji, to się zawiesza :)

Wszelkie wskazówki lub pomoc będą mile widziane. Bardzo dziękuję

+0

Czy zaimplementowano 'encodeRestorableStateWithCoder:' i 'decodeRestorableStateWithCoder:'? Możesz również sprawdzić ten samouczek. To ci pomoże. http://www.techotopia.com/index.php/An_iOS_6_iPhone_State_Preservation_and_Restoration_Tutorial –

+0

Zrobiłem teraz, że mogę uzyskać przywrócenie, ale jak już powiedziałem, chcę zrobić to samo po zabiciu aplikacji, ale kiedy użytkownik ją zabije, przywracanie nie jest uruchamiane przy następnych uruchomieniach, więc czy istnieje sposób na jego wymuszenie? –

+0

zgodnie z powyższym przywróceniem viewControllers stan jego nie będzie działać podczas ponownego uruchomienia aplikacji z rozciągnięcia. Domyślny stan nawigacji przywracania Apple nie zadziała w tym przypadku, ale możesz zrobić to samo z zapisem tego stanu użytkownika w DB i podczas gdy aplikacja otwiera się w tym czasie przywrócić go ręcznie programując logikę inną niż nie ma rozwiązania powyższego problemu, ale ta logika działa tylko z 3-4 push nawigacji, jeśli masz 7-8 push nawigacji, niż nie będzie działać. – CodeChanger

Odpowiedz

4

Zaimplementowano metody application:shouldRestoreApplicationState: i application: shouldSaveApplicationState: w delegacie aplikacji. Nadzieję, że cios krok może pomóc:

1. Ustaw identyfikatory renowacyjnych

Podczas przypisywania identyfikatorów renowacji, należy pamiętać, że wszystkie kontrolery widoku rodzica w widoku kontrolera hierarchii musi mieć identyfikatory rekultywacji też. Także NavigationController i umieszczenie zakładek ...

  • a. Przypisz poprawny ciąg do właściwości restoreorialIdentifier widoku.

  • b. Użyj widoku z kontrolera widoku, który ma również poprawny identyfikator przywracania.

  • c. W przypadku widoków tabel i widoków kolekcji przypisz źródło danych, które przyjmuje protokół UIDataSourceModelAssociation.

-

2. Aplikacja Tell chcesz używać stanu zachowania

Dodać dwie metody pliku delegate.m aplikacji wymagana zarówno do zapisywania i przywrócenie stanu aplikacji

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

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

3. Napisz i przeczytaj Stan kontrolera

Sterownik ochrony musi przyjąć protokół UIStateRestoring i użyć metod z tego protokołu, aby zapisać i odczytać jego stan.

-(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. przywracania ViewController

Wdrożenie viewControllerWithRestorationIdentifierPath: koder: metodę skojarzonego klasy przywrócenie odzyskać sterowania wyświetlania.

+ (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

Jest to całkiem użyteczne, ale odpowiada tylko na połowę mojego pytania. Bo mogę tego użyć tylko do przywrócenia z aplikacji w tle, która została zabita. Ale chcę, aby moja aplikacja zrobiła to samo po tym, jak ją zabiłem. Czy istnieje sposób na programowe rozpoczęcie procesu przywracania? –

+0

Nie można zabić aplikacji samodzielnie za pomocą przełącznika aplikacji, w przeciwnym razie przywracanie stanu po prostu nie będzie działać. – Stoull

Powiązane problemy