2013-02-26 5 views
3

У меня возникла проблема с функцией 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]; 
     } 
    } 
} 

Надеюсь, что этот подход поможет всем справиться с подобными проблемами ...

ответ

1

Похоже, вы хотите иметь более тонкий контроль над навигацией между веб-страницами в вашем приложении, а стандартная функция «назад/вперед» не будет работать.

Я рекомендую упростить вопросы, полностью игнорируя встроенный goBack и goForward функциональности в UIWebView, и ваши кнопки делегировать «StateManager» тип объекта - там, где на основе текущего состояния приложения и в каком направлении пользователь вы пытаетесь пойти, вы знаете, какое состояние должно привести (т.е.: какую страницу загружать).

Чтобы загрузить новое состояние, используйте только [_webView loadRequest:request] (или одну из других функций загрузки - см. Ниже), где request представляет новое состояние.

Я не вижу, как _requestURL используется в коде выше, но называть [_webView reload] просто загрузить последнюю страницу, которая была загружена с помощью одной из функций нагрузки UIWebView (то есть: loadData, loadHTMLString или loadRequest), или независимо от того, какая последняя страница была перенесена на потом (либо путем нажатия ссылок, либо перемещения назад/вперед).

+0

Благодарим вас за советы, Крис!Мы, наконец, закончили что-то, как вы сказали, «полностью игнорируя встроенную функцию goBack и goForward в UIWebView» и управляя URL напрямую с помощью кнопки «Назад». Мы также использовали [_webView loadRequest: request] для загрузки определенных страниц при выполнении условия. И пока у нас есть то, на что мы надеялись. Еще раз спасибо Крису, ваш ответ привел нас в правильном направлении! –

 Смежные вопросы

  • Нет связанных вопросов^_^