Как очистить задний список в UIWebview на iPhone?
Я хочу получить доступ/очистить задний список вперед, как если бы UIWebView
был новым. Есть ли общедоступный API или обходной путь для этого?
Я пробовал:
while ([webview canGoback]) {
[webview goBack];
}
но это также заморозит устройство (симулятор тоже).
Ответы
Ответ 1
Отказ
Как и в случае с этим, имейте в виду, что результаты могут не пройти через одобрение магазина приложений и могут вообще не работать с будущими версиями SDK.
В SDK нет официального метода для этого. Однако, если вы действительно хотите очистить историю назад/вперед UIWebView
, это можно сделать, немного вникая в частные рамки.
Быстрый и грязный способ сделать это (в комплекте с кучей уродливых предупреждений компилятора) выглядит следующим образом:
Учитывая, что myUIWebViewInstance
является абсолютно нормальным экземпляром UIWebView
:
id internalWebView=[[myUIWebViewInstance _documentView] webView];
[internalWebView setMaintainsBackForwardList:NO];
[internalWebView setMaintainsBackForwardList:YES];
В рамках существует также довольно заманчивый метод _clearBackForwardCache
, однако он, похоже, ничего не делал, когда его щекотали. Просто перевернувшись, баулян помог мне.
Ответ 2
Если вы пытаетесь "повторно использовать" существующий UIWebView и отключите возможность вернуться к предыдущей ранее предыдущей странице, вы можете:
-
При загрузке нового запроса (того, с которого пользователь не должен возвращаться) сохраните URL-адрес нового запроса, например:
self.curURL = [NSURL urlWithString:@"http://www.bla.com"];
[webview loadRequest:[NSURLRequest requestWithURL:curURL]];
-
Я предполагаю, что у вас есть собственная кнопка возврата, поэтому в вашем делетете делегата webViewDidFinishLoad добавьте:
backbttn.enabled = webView.canGoBack && ![[webView.request URL] isEqual: curURL];
Таким образом, пользователь даже не знает, что UIWebView может вернуться на страницу раньше.
Ответ 3
Просто заново создайте веб-просмотр. это будет reset все, включая историю.
Ответ 4
Я был успешным (насколько вы можете назвать такое обходное решение "успешным" ), используя следующую строку кода:
[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"if( window.history.length > 1 ) { window.history.go( -( window.history.length - 1 ) ) }; window.setTimeout( \"window.location.replace( '%@' )\", 300 );", targetLocation]];
где targetLocation
- желаемый URL как NSString
.
Что он делает, так это сказать браузеру идти так далеко назад, как и история, а затем, после небольшого таймаута, загрузить нужный URL.
Это, конечно, не решает проблему очистки вперед истории (которая мне не нужна в моем случае).
Ответ 5
Я думаю, что если вы отпустите объект uiwebview и заново создадите, он очистит историю. У меня действительно есть обратная проблема. Мой объект uiwebview автоматически освобождается во время события с низкой памятью, если он находится в невидимом виде. Затем мне нужно воссоздать его в viewDidLoad, но он не сохраняет историю с этого момента.
Ответ 6
Я бы предположил, что вы можете разбить историю, вручную загрузив некоторый HTML...
Что-то вроде:
[webview loadHTMLString:@"" baseURL:@""];
Ответ 7
Выбор гибкого подхода Гилберта: если он изменен, он работает с переадресацией (что-то пока не способно, как указывал mharper).
Перед загрузкой запроса сохраните нужный URL-адрес и установите переменную-член типа boolean с именем _saveURL
, чтобы указать, что URL-адрес перенаправления должен быть сохранен (вы увидите точное использование этих двух переменных позже):
- (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
}
(Разумеется, при компиляции в среде автоматического подсчета ссылок (ARC) вызовы сохранения и освобождения не будут необходимы.)
Теперь в обратном вызове делегата -webViewDidFinishLoad:
проверьте, произошло ли повторное перенаправление, проверяя, отличается ли URL-адрес текущего запроса веб-представления от желаемого URL-адреса. Если это так, сохраните URL-адрес переадресации в переменной-члене _firstURL
. Это также означает, что _saveURL
встает на свои места. Чтобы избежать перезаписи _firstURL
, каждый раз, когда вызывается этот метод делегата.
Также включите или отключите кнопки "Назад" и "Вперед" так, как мы это делали раньше.
- (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;
}
(Опять же, сохранение и освобождение не требуются при включенной ARC.)
Однако есть один из ключевых недостатков этого метода. Он работает, только если вы точно знаете, что URL-адрес, переданный в my_loadURL:
, будет перенаправлен. В противном случае переменная _firstURL
будет установлена в другом месте. Поэтому, если вы не можете определить, будет ли перенаправлять соответствующий URL, этот подход не соответствует вашим потребностям. Во всяком случае, это соответствовало моим потребностям, и я надеюсь, что смогу помочь и кому-то другому.
Обновление. Вы можете улучшить этот метод, отбросив все, что связано с _desiredURL, то есть не сохраняйте нужный URL-адрес в -my_loadURL:
и в -webViewDidFinishLoad:
просто скажите if(_saveURL)
. Таким образом, он будет работать на веб-сайтах, которые либо не перенаправляют вообще, либо перенаправляют мгновенно.
Ответ 8
Я пробовал почти каждое решение, опубликованное без особого успеха. Мое дело для плагина Phonebap для Childbrowser, но в этой же проблеме используется один экземпляр webview, используемый для отображения внешних страниц в моем приложении. Когда я показываю внешнюю страницу, веб-просмотр сохраняет историю предыдущих страниц.
Я хотел удалить историю, когда показываю новую внешнюю веб-страницу.
После некоторых исследований я нашел решение в этом сообщении SO, которое сработало для меня.
[webView stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML = \"\";"];
В случае childbrowser я поместил его в метод -(IBAction) onDoneButtonPress:(id)sender
, который ранее вставлял пустую страницу, чтобы начать пустую (но с включенной кнопкой возврата).
НТН!
Milton.