У меня возникла проблема с функцией goBack от UIWebView.UIWebView goBack to specific page
Мое требование, когда пользователь нажимает кнопку (называемую «Back Button»), я должен перенаправить пользователя на конкретную страницу в определенных условиях. Подумайте об этом как о «системе корзины»: когда пользователь находится на странице «Меню», он выбирает элемент и «добавляет товар в корзину». Когда он нажимает «Удалить элемент», перейдите на страницу «Элемент удален». Когда пользователь нажимает кнопку «Назад», пользователь должен вернуться в «Меню» вместо пустой страницы корзины.
Чтобы решить эту проблему, я подумал об использовании «Очереди» для сохранения истории URL-адресов, затем пользователь нажимает кнопку «Назад» в определенных условиях, перезагружает URL-адрес из «Очереди».
Я сделал пользовательский NSMutableArray с функциями enqueue/dequeue благодаря this answer. Затем, используя его для хранения истории 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);
}
}
Затем вызовите «перезагрузки», когда «Назад Кнопка» была нажата в определенных условиях:
- (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----");
}
}
...
Теперь я могу успешно получить «delBackPage», как URL страницы «Меню». Но когда я перезагружу webView с этим URL-адресом, это не сработает.
Я что-то упустил? Есть ли способ достичь этого? Если есть лучший способ контролировать URL WebView, это было бы очень оценено.
EDIT
Благодаря кончиков от Криса, мы, наконец, удалось контролировать "Back Button", как следующее:
- (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;
}
И "Back Button" ...
- (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 stored 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];
}
}
}
Надеюсь, что этот подход поможет всем справиться с подобными проблемами ...
Благодарим вас за советы, Крис!Мы, наконец, закончили что-то, как вы сказали, «полностью игнорируя встроенную функцию goBack и goForward в UIWebView» и управляя URL напрямую с помощью кнопки «Назад». Мы также использовали [_webView loadRequest: request] для загрузки определенных страниц при выполнении условия. И пока у нас есть то, на что мы надеялись. Еще раз спасибо Крису, ваш ответ привел нас в правильном направлении! –