Recogiendo el enfoque ingenioso de Gilbert: Si se modifica, funciona con redirecciones (algo que hasta ahora no es capaz, como señaló mharper).
Antes de cargar la solicitud, guardar la URL deseada y establecer una variable miembro de booleana llamada _saveURL
para indicar que la URL de redireccionamiento será salvo (verá el uso exacto de estas dos variables más adelante):
- (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
}
(el caso de compilar en un Saldo de referencias automático (ARC) entorno retener y liberar llamadas por supuesto, no será necesario.)
Ahora en la devolución de llamada delegado -webViewDidFinishLoad:
, comprobar para ver si la redirección ya se ha producido probando si la URL de la solicitud actual de la vista web difiere de la URL deseada De ser así, guarde la URL de redireccionamiento en una variable miembro _firstURL
. Aquí también es donde _saveURL
se pone en marcha. Es para evitar sobrescribir _firstURL
cada vez que se llama a este método delegado. Además, habilite o deshabilite los botones hacia atrás y hacia delante tal como lo hacíamos anteriormente.
- (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;
}
(Una vez más, retener y liberación no son necesarios con ARC habilitado.)
Sin embargo, hay una desventaja principal de este método. Solo funciona si sabe con certeza que la URL pasada al my_loadURL:
redirigirá. De lo contrario, la variable _firstURL
se establecerá de alguna manera. Entonces, si no puede decir si la URL correspondiente se redireccionará, entonces este enfoque no se ajusta a sus necesidades. De todos modos, se ajustaba a mis necesidades, y espero poder ayudar a alguien más también.
Actualización: Se puede mejorar este método dejando caer todo eso se trata de _desiredURL, significado no guardar la URL deseada en -my_loadURL:
y en -webViewDidFinishLoad:
acaba de decir if(_saveURL)
. De esta forma, funcionará para sitios web que no redireccionan o redirigen al instante.
¡Código muy astuto! Queremos que la aplicación ingrese en la tienda de aplicaciones para que esto no nos beneficie. Marque la respuesta correcta porque dijo que no había una forma oficial. Lástima – zsniperx
No hay duda, fui rechazado hoy por usar este código exacto. – bendytree
Apple acaba de rechazar una de mis aplicaciones para usar este marco privado. – Marsman