2016-07-13 85 views
6

Attualmente non riesco a capire cosa devo utilizzare per salvare e ripristinare lo stato dell'app.Salvare e ripristinare stack UINavigation per riconnettersi

Sto utilizzando uno storyboard e ho un bel po 'di ViewControllers, e voglio salvare tutti i miei stack di navigazione quando l'app viene terminata per poter ripristinare tutta la navigazione quando l'utente riavvia l'applicazione.

Sto utilizzando un UINavigationController con un altro UINavigationController al suo interno solo per informazioni.

ho trovato questo e leggere questo più e più volte: https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/PreservingandRestoringState.html#//apple_ref/doc/uid/TP40007457-CH28-SW34

(Obbligatorio) Assegnare identificatori restauro per i controller di vista di cui si desidera preservare la configurazione; vedere Tagging View Controllers for Preservation.

(obbligatorio) Indicare a iOS come creare o individuare nuovi oggetti del controller di visualizzazione in fase di avvio; consultare Ripristino dei controller di visualizzazione in fase di avvio.

Poi ho aggiunto un RestorationId su tutti i miei ViewControllers ma non capisco che cosa devo fare per la seconda parte, come quando aggiungo viewControllerWithRestorationIdentifierPath metodi che non passano all'interno.

Ho anche cercato di salvare il navigation.viewcontrollers nelle NSUserDefaults al fine di utilizzare di nuovo quando l'utente riavviare l'applicazione utilizzando il codice:

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

Ma quando torno nelle statistiche Apple App da raccontare io che il vincolo non viene rispettato e che l'app si blocca e poi quando aggiungo viewControllers nello stack della mia navigazione si blocca :)

Qualsiasi consiglio o aiuto sarebbe molto apprezzato. Grazie mille

+0

Avete implementato 'encodeRestorableStateWithCoder:' e 'decodeRestorableStateWithCoder:'? Puoi anche controllare questo tutorial. Ti aiuterà. http://www.techotopia.com/index.php/An_iOS_6_iPhone_State_Preservation_and_Restoration_Tutorial –

+0

Ho fatto ora un restauro, ma come ho detto voglio fare lo stesso processo dopo aver ucciso l'applicazione da solo, ma quando l'utente lo uccide, il il ripristino non viene avviato alle prossime partenze, quindi c'è un modo per forzarlo? –

+0

come per la precedente vista di ripristino. I controllori dichiarano che non funzionerà mentre si riavvia l'applicazione da una fase di estensione. Lo stato di navigazione di ripristino predefinito di Apple non funzionerà in questo caso, ma puoi fare lo stesso con il salvataggio di questo stato utente nel DB e mentre l'app si sta aprendo in quel momento, ripristinarlo manualmente programmando la logica in modo diverso da una soluzione del problema precedente, ma questa logica funziona solo con 3-4 tasti di navigazione se hai 7-8 tasti di navigazione che non funzionerà. – CodeChanger

risposta

4

Hai implementato i metodi application:shouldRestoreApplicationState: e application: shouldSaveApplicationState: in delegato dell'applicazione. Spero che il colpo passo può aiutare a:

1. Set di restauro identificatori

Quando l'assegnazione degli indicatori di restauro, ricordare che tutti i controller di vista padre nella gerarchia controller della vista devono avere identificatori di restauro troppo. Includere anche navigationController e TabBar ...

  • a. Assegnare una stringa valida alla proprietà restoreIdentifier della vista.

  • b. Utilizzare la vista da un controller di visualizzazione che ha anche un identificatore di ripristino valido.

  • c. Per le viste tabella e le viste di raccolta, assegnare un'origine dati che adotta il protocollo UIDataSourceModelAssociation.

-

2. applicazione di Tell si desidera utilizzare lo stato di conservazione

Aggiungi i due metodi al file delegate.m applicazione richiesto sia il salvataggio e il ripristino dello stato di applicazione

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

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

3. Scrivere e leggere Stato controller

Il controller di Preservation deve adottare il protocollo UIStateRestoring e utilizzare i metodi di tale protocollo per scrivere e leggere il suo stato.

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

Attuare viewControllerWithRestorationIdentifierPath: coder: metodo della classe ristorazione associata per recuperare il controller della vista.

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

Questo è in realtà abbastanza utile, ma risponde solo alla metà della mia domanda. Perché posso utilizzare questo solo per ripristinare dall'app di sfondo che sono stati uccisi. Ma voglio che la mia app faccia lo stesso dopo averlo ucciso. C'è un modo per avviare la procedura di ripristino programmaticamente? –

+0

Non puoi uccidere l'app da solo tramite l'app switcher, altrimenti il ​​ripristino dello stato semplicemente non funzionerà. – Stoull

Problemi correlati