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