Подтвердить что ты не робот

Как очистить задний список в UIWebview на iPhone?

Я хочу получить доступ/очистить задний список вперед, как если бы UIWebView был новым. Есть ли общедоступный API или обходной путь для этого?

Я пробовал:

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

но это также заморозит устройство (симулятор тоже).

4b9b3361

Ответ 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.