Pytanie Jak wyczyścić poprzednią listę w interfejsie UIWebview na telefonie iPhone?


Chcę uzyskać dostęp / wyczyścić listę z powrotem do przodu, tak jakby UIWebView znowu jest nowy. Czy istnieje jakiś publiczny interfejs API lub obejście tego problemu?

Próbowałem:

while ([webview canGoback]) {
    [webview goBack];
}

ale to zamrozi urządzenie (również symulator).


12
2017-09-26 21:35


pochodzenie




Odpowiedzi:


Zrzeczenie się
Podobnie jak w przypadku takich sytuacji, należy pamiętać, że wyniki mogą nie zostać zatwierdzone przez sklep z aplikacjami i mogą nie działać w ogóle przy przyszłych wersjach pakietu SDK.


Nie ma urzędnik metoda wykonania tego w SDK. Jednak jeśli naprawdę chcesz wyczyścić historię wstecz / dalej pliku UIWebView można to zrobić z odrobiną zagłębienia się w prywatne ramy.

Szybki i brudny sposób to zrobić (wraz z kilkoma brzydkimi ostrzeżeniami dla kompilatora) wygląda następująco:

Jeśli się uwzględni myUIWebViewInstance jest całkowicie normalnym przykładem UIWebView:

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

Jest też dość kusząca _clearBackForwardCache metoda w ramach, ale wydaje się, że nie robi wiele, gdy się połaskocze. Tylko przerzucenie boolian sprawiło mi przyjemność.


17
2017-11-04 16:15



Bardzo podstępny kod! Chcemy, aby aplikacja trafiła do sklepu z aplikacjami, więc nie przyniesie to nam korzyści. Zaznacz poprawnie, ponieważ powiedziałeś, że nie było oficjalnego sposobu. Szkoda - zsniperx
Bez wątpienia zostałem dzisiaj odrzucony za użycie tego dokładnego kodu. - bendytree
Apple właśnie odrzucił jedną z moich aplikacji do korzystania z tej prywatnej platformy. - Marsman
[internalWebView setMaintainsBackForwardList: NO]; Nie znaleziono metody setMaintainsBackForwardList :( - Anshad Rasheed


Jeśli próbujesz ponownie wykorzystać istniejący interfejs UIWebView i wyłączyć możliwość powrotu do poprzedniej strony, na której był wcześniej, możesz:

  1. Podczas ładowania nowego żądania (tego, z którego użytkownik nie powinien powracać), zapisz adres URL nowego żądania, np.

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

  2. Zgaduję, że masz swój własny przycisk powrotu, więc w swojej metodzie delegowania webViewDidFinishLoad dodaj:

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

W ten sposób użytkownik nie będzie nawet wiedział, że UIWebView może wrócić do strony wcześniej.


13
2018-01-13 16:18



Rozumiem, co masz na myśli, ale myślę, że to nie pasuje dokładnie do mojej sytuacji. Z pewnością byłaby to właściwa odpowiedź, gdybym nie chciał wyłączyć możliwości powrotu. Moja sytuacja polega na tym, że muszę umieścić UIWebView na jego głównym adresie URL, aby móc wyświetlić pasek narzędzi, z którym można przejść i mieć oddzielny pasek narzędzi dla wszystkich adresów URL. Dziękujemy za pomoc! - zsniperx
Doskonałe rozwiązanie w większości przypadków. Wydaje się łamać, gdy adres URL przekierowuje. Nadal warte głosu! - mharper


Po prostu odtwórz wyświetlenie internetowe. zresetowałoby wszystko, łącznie z historią.


6
2018-03-15 15:58



Próbowałem, ale z jakiegokolwiek powodu prowadziło to do wolnego ładowania. - Supertecnoboff
Usuwa również pamięć podręczną, której czasami nie chcesz robić. Na przykład, gdy chcesz zachować zawartość koszyka na zakupy. - Guy Lowe
co masz na myśli, odtwarzając webivew? ponowne przydzielanie i inicjowanie - Elstine P


Udało mi się (o ile można nazwać takie obejście "sukcesem"), używając następującego wiersza kodu:

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

gdzie targetLocation jest żądanym adresem URL jako NSString.

To, co robi, to nakazanie przeglądarce, aby sięgała wstecz do historii, a następnie, po krótkim czasie oczekiwania, załaduj żądany adres URL.

To oczywiście nie rozwiązuje problemu wyczyszczenia historii naprzód (której nie potrzebowałem w moim przypadku).


5
2017-11-04 19:21



Niestety nie zadziała to, jeśli wcześniej używana była programowa nawigacja wstecz / do przodu: w tym przypadku history.lengthnie jest już zsynchronizowany z rzeczywistym stosem historii i wyświetli liczbę stron nawigowanych przez użytkownika (klikając łącza). history.length zazwyczaj będzie większy niż liczba stron, które możesz cofnąć, i history.go(history.length-1) jest poza zasięgiem i po cichu zawiedzie. - Julian D.


Myślę, że jeśli zwolnisz obiekt uiwebview i odtworzysz go, to wyczyści historię. Właściwie mam odwrotny problem. Mój obiekt uiwebview zostanie automatycznie zwolniony podczas zdarzenia o niskiej pamięci, jeśli znajduje się wewnątrz niewidocznego widoku. Muszę odtworzyć go w viewDidLoad, ale nie zachowuje historii od tego momentu.


2
2018-03-23 01:34





Wyobrażam sobie, że możesz złamać historię, ręcznie ładując jakiś HTML ...

Coś jak:

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

0
2017-09-27 20:00



Cześć Colin, dziękuję za odpowiedź. Niestety, nadal potrzebowałbym wrócić do pierwszej strony na liście, aby to zrobić. Nawet wtedy tylko zastąpi strony po pierwszym. Zostawić tam pierwszą - zsniperx


Próbowałem prawie każdego rozwiązania opublikowanego bez większego sukcesu. Mój przypadek dotyczy wtyczki phonegap Childbrowser, ale opiera się na tym samym problemie, jednej instancji webview używanej do wyświetlania stron zewnętrznych w mojej aplikacji. Kiedy wyświetlam stronę zewnętrzną, przeglądarka przechowuje historię poprzednich wyświetlanych stron. Chciałem usunąć historię, gdy wyświetlam nową stronę zewnętrzną.

Po pewnych badaniach znalazłem rozwiązanie w tym poście SO to zadziałało dla mnie.

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

W przypadku przeglądarki dziecięcej umieściłem ją w metodzie -(IBAction) onDoneButtonPress:(id)sender, która wcześniej wstawiła pustą stronę, aby rozpocząć pustą (ale z włączonym przyciskiem Wstecz).

HTH! Milton.


0
2018-05-25 04:13





Podejmowanie mądrego podejścia Gilberta: jeśli jest zmodyfikowane, działa z przekierowaniami (coś, czego nie jest w stanie do tej pory, jak zauważył mharper).

Przed załadowaniem żądania zapisz żądany adres URL i ustaw zmienną składową logiczną o nazwie _saveURL aby wskazać, że przekierowanie URL zostanie zapisane (zobaczysz dokładne użycie tych dwóch zmiennych później):

- (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
}

(Zachowywanie i wyzwalanie wywołań oczywiście nie będzie konieczne, jeśli kompilujesz w środowisku automatycznego liczenia zliczeń ARC).

Teraz w -webViewDidFinishLoad: delegować wywołanie zwrotne, sprawdź, czy przekierowanie już nastąpiło, sprawdzając, czy adres URL bieżącego żądania widoku sieciowego różni się od żądanego adresu URL. Jeśli tak, zapisz przekierowanie w zmiennej członkowskiej _firstURL. To także jest miejsce _saveURL wchodzi na miejsce. Ma to zapobiec nadpisywaniu _firstURL za każdym razem, gdy wywoływana jest ta metoda delegata. Ponadto włącz lub wyłącz przyciski wstecz i do przodu, tak jak wcześniej.

- (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;
}

(Ponownie, zatrzymanie i zwolnienie nie są potrzebne przy włączonym ARC.)

Istnieje jednak jedna główna wada tej metody. Działa tylko wtedy, gdy wiesz na pewno, że adres URL przeszedł my_loadURL: przekieruje. W przeciwnym razie _firstURL zmienna zostanie ustawiona gdzieś indziej. Jeśli więc nie możesz określić, czy odpowiedni URL będzie przekierowywał, to podejście nie spełnia Twoich wymagań. W każdym razie pasowało to do moich potrzeb i mam nadzieję, że pomogę komuś innemu.

Aktualizacja: możesz ulepszyć tę metodę, upuszczając wszystko, co zajmuje _desiredURL, co oznacza, że ​​nie zapisujesz pożądanego adresu URL w -my_loadURL: i w -webViewDidFinishLoad: tylko powiedz if(_saveURL). W ten sposób będzie działać dla witryn, które albo nie przekierowują w ogóle, albo przekierowują natychmiast.


0
2018-05-25 02:47