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) или какой бы ни была последняя страница, на которую потом переходили (либо путем нажатия на ссылки, либо путем перехода назад / вперед).

Другие вопросы по тегам