2010-09-26 4 views

risposta

17

responsabilità
Come con qualcosa di simile, tenere a mente che i risultati potrebbero non arrivare all'approvazione dell'app store e potrebbero non funzionare affatto con le future revisioni dell'SDK.


Non v'è alcun metodoufficiale per fare questo nel SDK. Tuttavia, se vuoi veramente cancellare la cronologia back/forward di un UIWebView, puoi farlo con un po 'di approfondimento nei framework privati.

Un modo rapido e sporco di farlo (completo di un gruppo di avvisi del compilatore brutto) è la seguente:

Dato che myUIWebViewInstance è un esempio perfettamente normale di UIWebView:

id internalWebView=[[myUIWebViewInstance _documentView] webView];  
[internalWebView setMaintainsBackForwardList:NO]; 
[internalWebView setMaintainsBackForwardList:YES]; 

C'è anche il piuttosto allettante metodo _clearBackForwardCache nel framework, tuttavia non sembrava fare molto quando solleticato. Basta lanciare il boolian ha funzionato un piacere per me.

+0

Codice molto subdolo! Vogliamo che l'app entri nell'app store, quindi questo non ci giova. Mark corretto perché hai detto che non c'era un modo ufficiale. Peccato – zsniperx

+9

Senza dubbio, oggi sono stato respinto per aver usato questo codice esatto. – bendytree

+5

Apple ha appena rifiutato una delle mie app per utilizzare questo framework privato. – Marsman

0

mi immagino si può rompere la storia caricando manualmente alcuni HTML ...

Qualcosa di simile:

[webview loadHTMLString:@"" baseURL:@""]; 
+0

Ciao Colin, grazie per la risposta. Purtroppo, avrei ancora bisogno di tornare alla prima pagina dell'elenco per farlo. Anche in quel caso, sostituirà solo le pagine dopo la prima. Lasciando il primo lì – zsniperx

13

Se stai cercando di "riutilizzo" di un UIWebView esistente, e disabilitare la possibilità di tornare a qualsiasi pagina precedente in cui era prima, è possibile:

  1. Quando si carica la nuova richiesta (la uno che utente non deve tornare indietro da), salvare l'URL della nuova richiesta, per esempio come:

    self.curURL = [NSURL urlWithString:@"http://www.bla.com"];
    [webview loadRequest:[NSURLRequest requestWithURL:curURL]];

  2. sto indovinando avete il vostro tasto posteriore, così sul metodo delegato webViewDidFinishLoad, aggiungi:

    backbttn.enabled = webView.canGoBack && ![[webView.request URL] isEqual: curURL];

In questo modo, l'utente non sarà nemmeno sapere che l'UIWebView può tornare alla pagina precedente.

+0

Vedo cosa intendi, ma suppongo che questo non si adatti esattamente alla mia situazione, sarebbe sicuramente la risposta corretta se non dovessi disabilitare la possibilità di tornare indietro. ho bisogno di mettere UIWebView nel suo URL radice in modo che possa visualizzare una barra degli strumenti per andare con esso e avere una barra degli strumenti separata per qualsiasi URL su di esso.Grazie per il tuo aiuto però! – zsniperx

+0

Ottima soluzione nella maggior parte dei casi. l'URL reindirizza. Vale ancora la pena di votare! – mharper

4

ho avuto successo (per quanto è possibile chiamare una tale soluzione 'successo') utilizzando la seguente riga di codice:

[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"if(window.history.length > 1) { window.history.go(-(window.history.length - 1)) }; window.setTimeout(\"window.location.replace('%@')\", 300);", targetLocation]]; 

dove targetLocation è l'URL desiderato come NSString.

Quello che fa è dire al browser di andare all'indietro come la cronologia va e quindi, dopo un breve timeout, caricare l'URL desiderato.

Questo naturalmente non risolve il problema di cancellare la cronologia di andata (di cui non avevo bisogno nel mio caso).

+0

Sfortunatamente questo non funzionerà se prima è stata usata la navigazione programmatica avanti/indietro: in questo caso 'history.length' non è più sincronizzato con lo storico stack della cronologia e mostrerà il numero di pagine navigabili dall'utente (facendo clic sui collegamenti). 'history.length' sarà in genere più grande del numero di pagine che è possibile tornare indietro e' history.go (history.length-1) 'è fuori limite e fallire quietamente –

2

Penso che se si rilascia l'oggetto uiwebview e si ricominci, si cancellerebbe la cronologia. In realtà ho un problema inverso. Il mio oggetto uiwebview viene rilasciato automaticamente durante un evento di memoria insufficiente se si trova all'interno di una vista non visibile. Devo quindi ricrearlo in viewDidLoad ma non conserva la cronologia da quel punto in poi.

0

Raccogliere l'approccio intelligente di Gilbert: Se modificato, funziona con i reindirizzamenti (qualcosa che non è in grado di fare finora, come ha sottolineato Mharper).

Prima di caricare la richiesta, salvare l'URL desiderato e impostare una variabile membro booleano chiamato _saveURL per indicare che l'URL di reindirizzamento sarà salvato (si vedrà il corretto utilizzo di queste due variabili più tardi):

- (void)my_loadURL:(NSURL *)url 
{ 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; // create the request 
    [_desiredURL release]; // clear up the previous value (assuming -my_loadURL: may be called multiple times) 
    _desiredURL = [url retain]; // store the desired URL (will be used later) 
    _saveURL = YES; // will also be used later 
    [_webView loadRequest:request]; // start loading the request 
} 

(la compilazione se in un conteggio automatico di riferimento (ARC) ambiente trattenere e rilasciare le chiamate, naturalmente, non sarà necessario.)

Ora nel delegato di callback -webViewDidFinishLoad:, verificare se il reindirizzamento ha già verificato testando se l'URL della richiesta corrente della vista web è diverso da l'URL desiderato. In tal caso, salva l'URL di reindirizzamento in una variabile membro _firstURL. Questo è anche il punto in cui _saveURL entra in posizione. È per evitare di sovrascrivere _firstURL ogni volta che viene chiamato questo metodo delegato. Inoltre, abilita o disabilita i pulsanti avanti e indietro proprio come facevamo prima.

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    // grab the URL currently being loaded 
    NSURL *currentURL = [webview.request URL]; 

    // check whether we are supposed to save the redirect URL and 
    // whether redirection has taken place yet 
    if (_saveURL && ![currentURL isEqual:_desiredURL]) { 
     [_firstURL release]; 
     _firstURL = [currentURL retain]; 
    } 

    // adjust the enabled-state of the back and forward buttons just like before 
    _backButton.enabled = _webView.canGoBack && ![currentURL isEqual:_firstURL]; 
    _forwardButton.enabled = _webView.canGoForward; 
} 

(Ancora, trattenere e rilasciare non sono necessari con ARC abilitato.)

Tuttavia, c'è uno svantaggio principale di questo metodo. Funziona solo se sai per certo che l'URL passato a my_loadURL: verrà reindirizzato. In caso contrario, la variabile _firstURL verrà impostata diversamente. Quindi se non riesci a capire se l'URL corrispondente verrà reindirizzato, allora questo approccio non si adatta alle tue esigenze. Ad ogni modo, si adattava ai miei bisogni, e spero di poter aiutare anche qualcun altro.

Aggiornamento: È possibile migliorare questo metodo facendo cadere tutto questo si occupano di _desiredURL significato non salvare l'URL desiderato in -my_loadURL: e in -webViewDidFinishLoad: solo dire if(_saveURL). In questo modo, funzionerà per i siti Web che non reindirizzano affatto o che reindirizzano all'istante.

0

Ho provato quasi tutte le soluzioni pubblicate senza molto successo. Il mio caso è per il plug-in per PhoneGap di Childbrowser, ma si basa sullo stesso problema, una singola istanza di webview utilizzata per mostrare pagine esterne nella mia applicazione. Quando mostro una pagina esterna, la webview conserva la cronologia delle pagine precedenti mostrate. Volevo rimuovere la cronologia quando mostro una nuova pagina Web esterna.

Dopo alcune ricerche, ho trovato una soluzione in this SO post che ha funzionato per me.

[webView stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML = \"\";"]; 

Nel caso di childbrowser, ho messo nel metodo -(IBAction) onDoneButtonPress:(id)sender, che precedentemente inserita una pagina vuota per iniziare vuoto (ma con pulsante indietro abilitata).

HTH! Milton.

5

Basta ricreare la visualizzazione Web. ripristinerebbe tutto incluso la cronologia.

+0

L'ho provato, ma per qualche ragione porta a tempi di caricamento lenti .... – Supertecnoboff

+0

Cancella anche la cache che a volte non vuoi fare. Ad esempio, quando si desidera conservare il contenuto di un carrello della spesa. –

Problemi correlati