2012-03-06 8 views
5

Concetto semplice, tuttavia non funziona. Ho due pulsanti nel mio UIWebView, un pulsante indietro e un pulsante avanti. I pulsanti Indietro chiamano [self.webView goBack] e inoltrati [self.webView goForward].iOS - problemi con canGoForward e canGoBack in webViewDidStartLoad

Ora voglio sapere in pratica se lo UIWebView può tornare indietro. Se è così, quindi abilitare il pulsante Indietro, e lasciarlo tornare, e lo stesso per il pulsante avanti.

-(void)webViewDidStartLoad:(UIWebView *)webView 
{  
    if([self.webView canGoForward]) { 
     [forwardArrowBtn setEnabled:YES]; 
    } else { 
     [forwardArrowBtn setEnabled:NO]; 
    } 

    if([self.webView canGoBack]) { 
     [backArrowBtn setEnabled:YES]; 
    } else { 
     [backArrowBtn setEnabled:NO]; 
    } 
} 

Il problema è che questo non funziona sul primo carico. Per esempio: clicco su un link all'interno dello UIWebView, va alla pagina, ma il pulsante Indietro è ancora disabilitato e non cliccabile. Non fino a quando non clicco su un altro link, il pulsante Indietro verrà abilitato e inizierà a funzionare.

Come mai questo non funziona la prima volta che vai a una pagina diversa, e funziona solo la seconda volta?

risposta

12

Ho risolto questo problema inserendo il codice di impostazione del pulsante non solo in webViewDidStartLoad. Scrivi un metodo e chiamalo da webViewDidStartLoad, webViewDidFinishLoad e shouldStartLoadWithRequest. Funziona perfettamente con la mia app.

+0

Si tratta di un aggiramento per una soluzione più semplice? Funziona comunque ... – Romes

+0

Puoi mostrare ... o spiegare meglio ...? – Morkrom

+0

'webViewDidFinishLoad:' è il posto giusto per il controllo. Il problema sembra essere un bug in WebKit. Per una spiegazione dettagliata, vedi [http://stackoverflow.com/questions/18948373/why-is-uiwebview-cangoback-no-in-ios7 questa domanda e risposta SO] – Olie

3

La tua prima pagina è una posizione web o un file sul dispositivo? Ho questo problema quando sto iniziando con loadHTMLString, presumibilmente perché non c'è davvero nulla in cui tornare (presumo che l'interfaccia utente non memorizzi nella cache il contenuto della pagina, solo il riferimento alla pagina). Quando lavoro con loadRequest, funziona perfettamente. Detto questo, devi fare come ha dichiarato Aemsn. Un buon tutorial può essere trovato a this link.

1

essere venuti qui mentre facendo una ricerca sul web a caso, per rispondere alla domanda 'base' del perché funziona solo la seconda volta:

webViewDidStartLoad viene chiamato prima effettivamente caricare la pagina successiva. Per quello che stai facendo, webViewDidFinishLoad ha più senso. Quindi quando fai il tuo primo carico, non puoi tornare indietro (niente caricato per avanti o indietro). Quando si cambiano le pagine la prima volta, non è ancora possibile - viene caricata solo una pagina (corrente). Quindi, la seconda volta in poi è quando sembra funzionare.

0

Ho avuto lo stesso identico problema e l'ho appena capito. Immagino che tu non abbia usato il selettore webView:loadRequest: per caricare il webcontent? Invece probabilmente hai usato il webView:loadData:MIMEType:textEncodingName:baseURL: o il selettore loadHTMLString:baseURL:.

Questo è esattamente quello che ho fatto. Se invece usi il selettore webView:loadRequest:, funzionerà, almeno per me.