2013-01-29 16 views
6

Secondo il docs:Come funziona il ripristino dello stato di iOS 6 UIWebView?

In iOS 6 e versioni successive, se si assegna un valore alla proprietà restorationIdentifier di questo punto di vista, si tenta di preservare la sua storia URL, la scala e le posizioni di scorrimento per ogni pagina, e le informazioni di cui la pagina è attualmente visualizzata. Durante il ripristino, la vista ripristina questi valori in modo che il contenuto Web appaia esattamente come prima.

Sto facendo tutto questo, ma non succede nulla. E anche se salvi e ripristini manualmente l'URL che l'utente stava guardando in precedenza, la posizione di scorrimento non viene ripristinata. I documenti sono semplicemente sbagliati?

risposta

5

Ho provato la risposta di Matt e funziona bene, tuttavia se ci sono pagine "in avanti" nello stack della cronologia, verranno sostituite dalla richiesta ripristinata all'interno dell'oggetto vista Web.

Un approccio migliore è invece chiamare il metodo 'ricarica' sull'oggetto webview, questo ripristinerà la cronologia in entrambe le direzioni e lo spostamento di scorrimento dello zoom e del contenuto.

Se vuoi un esempio del mio approccio o un po 'di funzionalità per il proprio WebView, dà un'occhiata alla mia forchetta open source del SVWebViewController here.

+1

È meglio della mia risposta! – matt

+0

Tutti dovrebbero leggere la risposta di Matt per capire cosa sta succedendo e dove va il programma. Basta sostituire la sua chiamata "loadRequest" con "reload". – jasonjwwilliams

11

I documenti sono corretti, ma molto incompleti. Ecco cosa sta succedendo. Se una visualizzazione Web partecipa al ripristino dello stato (presumo che tu sappia cosa significa - tutto deve avere un restorationIdentifier e così via) e se la visualizzazione web ha una richiesta (non una stringa HTML) quando l'utente ha lasciato il app, la vista Web ritorna automaticamente in vita contenente la stessa richiesta della sua proprietà request e con gli elenchi Indietro e Avanti intatti. Pertanto, è possibile utilizzare il meccanismo di ripristino stato per ripristinare lo stato della visualizzazione Web, ma è necessario eseguire un po 'di danza in più. Questa danza è così curiosa e oscura che inizialmente ho avuto l'impressione che lo stato di una vista web non potesse essere salvato e ripristinato, nonostante l'affermazione della documentazione che poteva farlo.

Ci sono due segreti qui; una volta che li conosci, comprenderai il ripristino dello stato della visualizzazione web:

  • Una visualizzazione Web ripristinata non caricherà automaticamente la sua richiesta; questo dipende dal tuo codice.

  • Dopo che una visualizzazione Web ripristinata ha caricato la sua richiesta, il primo elemento nel relativo elenco Indietro è la stessa pagina nello stato in cui l'utente lo ha lasciato (scorrimento e zoom).

Sapendo questo, è possibile progettare facilmente una strategia per il ripristino dello stato della visualizzazione Web. La prima cosa è quello di rilevare che stiamo restaurando lo stato, e alzare una bandiera che dice così:

-(void)decodeRestorableStateWithCoder:(NSCoder *)coder { 
    [super decodeRestorableStateWithCoder:coder]; 
    self->_didDecode = YES; 
} 

Ora siamo in grado di rilevare (forse in viewDidAppear:) che stiamo restaurando lo stato, e che la vista web contiene magicamente un richiesta e carica quella richiesta:

if (self->_didDecode && wv.request) 
    [wv loadRequest:wv.request]; 

Ora per la parte difficile. Dopo aver caricato la vista, immediatamente "torniamo indietro". Ciò ha in effetti l'effetto di ripristinare la precedente posizione di scorrimento dell'utente (e di rimuovere la voce extra dalla parte superiore dello stack Indietro). Poi abbassiamo la nostra bandiera in modo che noi non facciamo questa mossa in più in qualsiasi altro momento:

- (void)webViewDidFinishLoad:(UIWebView *)wv { 
    if (self->_didDecode && wv.canGoBack) 
     [wv goBack]; 
    self->_didDecode = NO; 
} 

L'UIWebView è ora in stato in cui era quando l'utente in precedenza ha lasciato l'applicazione. Abbiamo salvato e ripristinato lo stato utilizzando la funzione integrata di salvataggio e ripristino di stato di iOS 6.

+0

Non so se si tratta di un capriccio di viste web, ma dopo '[wv goBack]', test '[wv canGoBack]' restituisce ancora 'YES', ancora e ancora. Provato in una visualizzazione web con una sola pagina nella cronologia (iOS 6.1.4). –

+1

C'è un progetto ovunque con questo lavoro? Non riesco a farlo funzionare – cannyboy

+0

Per curiosità, come si fa a creare una grande domanda per un problema complesso e sconcertante, e poi prontamente cancellarlo con una completa risposta di sé, in grande dettaglio, tutto nel giro di 2 minuti? Bello! Dov'è il badge SO per quel trucco? –