2012-12-06 7 views
5

My UIWebview carica un file html locale utilizzando loadHtmlString. La pagina caricata contiene collegamenti ad altri file html locali e link reali che utilizzano Internet.iPhone UIWebView loadHtmlString non aggiunto alla cronologia

ho aggiunto un pulsante indietro con:

if ([self.webView canGoBack]) [self.webView GoBack];

Questo funziona benissimo tranne che non riconosce la pagina originale caricata con loadHtmlString.

Per esempio, se naviga:
locale -> locale -> web
X locale locale < - web (Le prime opere posteriori, la prossima non fa nulla.)

Come posso ottenere l'WebView riconoscere la pagina originale in modo che il pulsante Indietro funzioni anche per questo? Posso aggiungerlo alla storia della webview in qualche modo?

Grazie in anticipo!

+0

Direi che 'loadHtmlString:' è una cattiva pratica per tutti tranne i casi d'uso più semplici. Dovresti invece prendere in considerazione l'esecuzione di un web server locale. Ho avuto successo con [CocoaHTTerver] (https://github.com/robbiehanson/CocoaHTTPServer) e [Modelli di baffi] (https://github.com/groue/GRMustache). Se sei in grado di scrivere l'intera app in HTML/JavaScript, valuta l'idea di utilizzare [Trigger.io] (https://trigger.io/) o simili. –

+0

Il mio caso d'uso era piuttosto semplice. Semplicemente servendo pagine statiche come parte di un libro come il formato. – Felix

+0

Pagine statiche? Ottimo, salvali nel tuo pacchetto e usa la tecnica che descrivo qui http://stackoverflow.com/a/17557309/354144 –

risposta

5

Ho avuto lo stesso problema. Ho provato a gestire la cronologia, ma è soggetta a errori. Ora ho scoperto una soluzione migliore di questo.

Quello che vuoi fare è semplicemente aggiungere un loadRequest a about: blank e renderlo come un segnaposto per te prima di chiamare loadHTMLString/loadData. Allora sei totalmente libero dal monitoraggio della storia. Il webview.canGoBack e canGoForward funzioneranno semplicemente. Certo, avrai bisogno di un trucco da gestire per tornare al segnaposto su: blank. Puoi farlo in webViewDidFinishLoad. Ecco il codice clou:

Nella funzione quando si chiama loadHTMLString:

[weakSelf.fbWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]]; 
[weakSelf.fbWebView loadHTMLString:stringResponse baseURL:url]; 

codice per gestire GoBack:

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    if ([webView.request.URL.absoluteString isEqualToString:@"about:blank"] 
     && ![webView canGoBack] && [webView canGoForward]) { 
    [weakSelf.fbWebView loadHTMLString:stringResponse baseURL:url]; 
    } 
} 

penso è anche possibile espandere questa soluzione per gestire quelli loadHTMLString questo non è il primo carico. Basta avere uno Stack per registrare tutta la risposta della stringa e inserire un about: blank su ogni loadHTMLString. E apri la pila ogni volta che torni a circa: vuoto.

+0

Bella soluzione. Grazie. – neobie

2

Ecco la soluzione Ho finito per usare:

ho creato un delegato per la WebView, che ha mantenuto traccia di se l'utente è stato sulla prima pagina (caricato usando loadHtmlString).

Quando si preme il pulsante Indietro e WebView non può più tornare indietro e l'utente NON si trova sulla prima pagina, viene caricata nuovamente la prima pagina (utilizzando loadHtmlString). Ecco il codice rilevante:

if ([self.webView canGoBack]) 
    [self.webView goBack]; 
else 
{ 
    WebViewDelegate * customDel = (WebViewDelegate *) self.webView.delegate; 
    if (customDel.onFirstPage == NO) 
    { 
     // Load original local page. 
     [self.webView loadHTMLString:self.htmlStr baseURL:[[NSBundle mainBundle] bundleURL]]; 

     customDel.onFirstPage = YES; 
    } 
} 

Io non sceglierò questa risposta per un po ', nel caso in cui una soluzione più elegante si apre.

Speriamo che questo aiuti qualcuno!

+1

cosa succede se l'utente apre la pagina html, fa clic su un collegamento a un altro URL, quindi come è possibile attivare ** onFirstPage **? – onmyway133

+0

Penso che abbia un bug. Supponiamo che sei atterrato sul sito A con loadHTMLString. Quindi vai a B, quindi vai a C. Quindi torna a B, e torna a A. Quindi se vai Avanti, andrà direttamente a C. B manca –

1

come Cloud Xu detto solo bisogno di precaricare manichino HTML, in questo modo:

webView.load(URLRequest(url: URL(string: "about:blank")!)) 
    webView.loadHTMLString("<html><body><b>Your page data</b></body></html>", baseURL: nil) 

proprio questo e nient'altro! Swift3

+0

loadRequest invece di caricare. Bella risposta! –

Problemi correlati