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.
È meglio della mia risposta! – matt
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