UIWebView Перейти на конкретную страницу
Я столкнулся с проблемой с функцией goBack UIWebView.
Мое требование - когда пользователь нажимает кнопку (называемую "кнопка возврата"), я должен перенаправить пользователя на определенную страницу в определенных условиях. Думайте об этом как о "системе корзины": когда пользователь находится на странице "Меню", он выбирает элемент и и "добавляет элемент в корзину". Когда он нажимает "удалить элемент", затем переходите на страницу "Элемент был удален". Когда пользователь нажимает кнопку "Назад", он должен вернуться к "Меню" вместо пустой страницы корзины.
Чтобы решить эту проблему, я подумал об использовании "Очереди" для сохранения истории URL, затем пользователь нажимает кнопку "Назад" при определенных условиях, перезагружая URL из "Очереди".
Благодаря этому ответу я создал собственный NSMutableArray с функциями enqueue / dequeue. Затем, используя его для хранения истории 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, он будет очень признателен.
РЕДАКТИРОВАТЬ
Благодаря советам Криса мы наконец-то смогли управлять кнопкой "Назад" следующим образом:
- (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;
}
И "Кнопка Назад"...
- (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];
}
}
}
Я надеюсь, что этот подход помогает всем, сталкивающимся с подобными проблемами...
1 ответ
Похоже, вы хотите иметь более точный контроль над переходом между веб-страницами в вашем приложении, а стандартная функциональность "назад / вперед" не подойдет.
Я рекомендую упростить вопросы, полностью игнорируя встроенные goBack
а также goForward
функциональность в UIWebView
и пусть ваши кнопки делегируются объекту типа "StateManager" - где, основываясь на текущем состоянии приложения и в каком направлении пытается двигаться пользователь, вы знаете, какое состояние должно получиться (т. е. какую страницу загрузить).
Чтобы загрузить новое состояние, просто используйте [_webView loadRequest:request]
(или одна из других функций загрузки - см. ниже), где request
представляет новое государство.
Я не вижу как _requestURL
используется в вашем коде выше, но вызывает [_webView reload]
просто загрузит последнюю страницу, которая была загружена с помощью одной из функций загрузки UIWebView (то есть: loadData
, loadHTMLString
, или же loadRequest
) или какой бы ни была последняя страница, на которую потом переходили (либо путем нажатия на ссылки, либо путем перехода назад / вперед).