UIWebView goBack a una página particular

Me enfrento a un problema con la function goBack de UIWebView.

Mi requisito es cuando el usuario presiona un button (llamado "Botón Atrás"), tengo que networkingirigir al usuario a la página particular en ciertas condiciones. Piense en ello como un "sistema de carro": cuando el usuario se encuentra en la página "Menú", selecciona un artículo y "agrega un artículo al carrito". Cuando click "eliminar un artículo", vaya a la página "El artículo fue eliminado". Cuando el usuario hace clic en el "Botón Atrás", el usuario debe volver al "Menú" en lugar de la página del carrito vacío.

Para resolver esto, pensé en usar "Queue" para save el historial de URL, luego el usuario presiona el "Botón Atrás" en ciertas condiciones, recarga la URL desde "Queue".

Hice NSMutableArray personalizado con funciones de enqueue / dequeue gracias a esta respuesta . Luego usarlo para almacenar el historial de URL:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { _currentPage = [[request URL] absoluteString]; NSString *targetURL = [self getTargetURLName:[request URL]]; if ([webViewHistory count] > 5) { [webViewHistory dequeue]; [webViewHistory enqueue:_currentPage]; } else { [webViewHistory enqueue:_currentPage]; } if ([targetURL isEqualToString:@"delete_cart"]) { delBackPage = [webViewHistory objectAtIndex:2]; NSLog(@"URL BEFORE DELETE: %@", delBackPage); } } 

Luego, llame a la "recarga" cuando se presionó el "Botón Atrás" en ciertas condiciones:

 - (void) backWebView:(id)sender { currentURL = [[_webView request] URL]; NSString *currentTGTName = [self getTargetURLName:currentURL]; if ([_webView canGoBack]) { if ([currentURL isEqual:[[_webView request] URL]]) { if ([currentTGTName isEqualToString:@"my_cart"] && delBackPage != nil) { NSLog(@"GO BACK FROM MY_CART: %@", delBackPage); _requestURL = delBackPage; [_webView reload]; } else { [_webView goBack]; NSLog(@"WEBVIEW CANGOBACK----"); } } ... 

Ahora puedo get "delBackPage" con éxito como URL de la página "Menú". Pero cuando vuelvo a cargar el webView con esa URL, no funcionará.

¿Me estoy perdiendo de algo? ¿Hay alguna forma de lograr esto? Si hay una mejor manera de controlar la URL de WebView, sería muy apreciado.

EDITAR

Gracias a los consejos de Chris, finalmente logramos controlar "Back Button" como el siguiente:

 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { url = [[request URL] absoluteString]; // Store the conditions if ([url rangeOfString:[NSString stringWithFormat:@"%@orders/my_cart", SITE_URL]].location != NSNotFound || [url rangeOfString:[NSString stringWithFormat:@"%@orders/add_cart", SITE_URL]].location != NSNotFound) { if ([currentURLStr rangeOfString:[NSString stringWithFormat:@"%@orders/top", SITE_URL]].location != NSNotFound || ...) { ref = currentURLStr; } } currentURLStr = url; return YES; } 

Y "button de retroceso" …

 - (void) backWebView:(id)sender { if ([currentURLStr rangeOfString:[NSString stringWithFormat:@"%@orders/top", SITE_URL]].location != NSNotFound || [currentURLStr rangeOfString:[NSString stringWithFormat:@"%@orders/error", SITE_URL]].location != NSNotFound) { [[self navigationController] popViewControllerAnimated:YES]; } else if ([currentURLStr rangeOfString:[NSString stringWithFormat:@"%@orders/genre", SITE_URL]].location != NSNotFound || ....) { [_webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@orders/top/%@/%@", SITE_URL, guid, authKey]]]]; // Refer the stonetworking conditions... } else if ([currentURLStr rangeOfString:[NSString stringWithFormat:@"%@orders/my_cart", SITE_URL]].location != NSNotFound) { if ([ref rangeOfString:[NSString stringWithFormat:@"%@orders", SITE_URL]].location != NSNotFound) { [_webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:ref]]]; ref = @""; } else { [_webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@orders/top/%@/%@", SITE_URL, guid, authKey]]]]; } } else { if (![_webView canGoBack]) { [[self navigationController] popViewControllerAnimated:YES]; } else { [_webView goBack]; } } } 

Espero que este enfoque ayude a todos a enfrentar problemas similares …

Parece que desea tener un control más preciso sobre la navigation entre las páginas web de su aplicación, y la funcionalidad estándar de respaldo y avance no funcionará.

Recomiendo simplificar los asuntos ignorando por completo las funciones goForward goBack y goForward en UIWebView , y UIWebView que sus botones deleguen en un object de tipo "StateManager" -donde se basa en el estado actual de la aplicación y en qué dirección está intentando ir el usuario , usted sabe qué estado debe dar lugar (es decir: qué página cargar).

Para cargar el nuevo estado, simplemente use [_webView loadRequest:request] (o una de las otras funciones de carga, vea a continuación), donde la request representa el nuevo estado.

No veo cómo se utiliza _requestURL en el código anterior, pero al llamar a [_webView reload] se acaba de cargar la última página que se cargó a través de una de las funciones de carga de UIWebView (es decir, loadHTMLString , loadHTMLString o loadRequest ) o lo que sea La última página a la que navegó fue después (ya sea haciendo clic en los enlaces o navegando hacia atrás / adelante).