Как очистить список перемотки назад в UIWebview на iPhone? - PullRequest
12 голосов
/ 27 сентября 2010

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

Я пробовал:

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

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

Ответы [ 8 ]

17 голосов
/ 04 ноября 2010

Отказ от ответственности
Как и в случае с чем-либо подобным, имейте в виду, что результаты могут не достичь одобрения магазина приложений и могут вообще не работать с будущими версиями SDK.


Официального метода для этого в SDK не существует.Однако, если вы действительно хотите очистить историю перемотки назад / вперед UIWebView, это можно сделать, немного углубившись в частные структуры.

Быстрый и грязный способ сделать это (в комплекте с кучейуродливые предупреждения компилятора) выглядит следующим образом:

Учитывая, что myUIWebViewInstance является совершенно нормальным экземпляром UIWebView:

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

В методе также есть довольно заманчивый _clearBackForwardCacheрамки, однако, казалось, не так много, когда щекотали.Просто щелкнув по-болгарски, я получил удовольствие.

13 голосов
/ 13 января 2011

Если вы пытаетесь «повторно» использовать существующий UIWebView и отключаете возможность вернуться на предыдущую страницу, на которой он был ранее, вы можете:

  1. При загрузке нового запроса (с которого пользователь не должен возвращаться) сохраните URL-адрес нового запроса, например, как:

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

  2. Я предполагаю, что у вас есть собственная кнопка возврата, поэтому в вашем методе делегата webViewDidFinishLoad добавьте:

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

Таким образом, пользователь даже не узнает, что UIWebView может вернуться на страницу раньше.

6 голосов
/ 15 марта 2013

Просто воссоздайте веб-просмотр. это сбросило бы все, включая историю.

5 голосов
/ 04 ноября 2011

Я добился успеха (насколько вы можете назвать такой обходной путь «успешным»), используя следующую строку кода:

[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.

Это, конечно, не решает проблемуочистки истории движения вперед (что мне не нужно в моем случае).

2 голосов
/ 23 марта 2012

Я думаю, что если вы отпустите объект uiwebview и создадите его заново, он очистит историю. У меня действительно есть обратная проблема. Мой объект uiwebview автоматически освобождается во время события нехватки памяти, если он находится внутри невидимого представления. Затем мне нужно воссоздать его в viewDidLoad, но он не сохраняет историю с этого момента.

0 голосов
/ 25 мая 2012

Я попробовал почти все опубликованные решения без особого успеха.В моем случае это плагин Phonegap для Childbrowser, но он основывается на той же проблеме - единственном экземпляре веб-просмотра, который используется для отображения внешних страниц в моем приложении.Когда я показываю внешнюю страницу, веб-просмотр сохраняет историю предыдущих страниц.Я хотел удалить историю, когда я показываю новую внешнюю веб-страницу.

После некоторого исследования я нашел решение в этом посте SO , которое мне помогло.

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

В случае с childbrowser я поместил его в метод -(IBAction) onDoneButtonPress:(id)sender, который ранее вставлял пустую страницу, чтобы начать пустой (но с включенной кнопкой возврата).

HTH!Milton.

0 голосов
/ 25 мая 2012

Принятие хитрого подхода Гилберта: если его изменить, он работает с перенаправлениями (на что он не способен, как указал мхарпер).

Перед загрузкой запроса сохраните нужный URL-адрес и установите переменную логического члена с именем _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). Таким образом, он будет работать для веб-сайтов, которые либо вообще не перенаправляют, либо мгновенно перенаправляют.

0 голосов
/ 28 сентября 2010

Я полагаю, вы можете сломать историю, вручную загрузив какой-нибудь HTML ...

Что-то вроде:

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