2013-02-26 51 views
3

我正面臨着UIWebView的goBack功能的問題。UIWebView goBack特定頁面

我的要求是當用戶按下按鈕(稱爲「後退按鈕」)時,我必須在特定條件下將用戶重定向到特定頁面。將其視爲「購物車系統」:當用戶處於「菜單」頁面時,他選擇一個項目並且「將項目添加到購物車」。當他點擊「刪除一個項目」,然後去「項目被刪除」頁面。當用戶點擊「返回按鈕」時,用戶應該回到「菜單」而不是空購物車頁面。

爲了解決這個問題,我考慮使用「隊列」保存URL歷史,然後用戶在特定條件下按下「後退按鈕」,從「隊列」中重新加載URL。

感謝this answer,我製作了自定義NSMutableArray入隊/出隊功能。然後用它來存儲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。但是當我使用該URL重新加載webView時,它不起作用。

我錯過了什麼嗎?有什麼辦法可以做到這一點?如果有更好的方法來控制WebView的URL,將非常感激。

編輯

感謝來自克里斯的提示,我們終於設法控制 「返回」 按鈕類似如下:

​​

和 「返回」 按鈕...

- (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

這聽起來像您希望對應用中的網頁之間的導航進行更精細的控制,並且標準的後退/前進功能不會執行。

我建議通過完全忽略簡化事項內置在UIWebViewgoBackgoForward功能,並有你的按鈕委託給「StateManager」類型的對象 - 在基於應用程序的當前狀態和方向用戶試圖去,你知道應該導致哪個狀態(即:加載哪個頁面)。

要加載新狀態,只需使用[_webView loadRequest:request](或其他加載函數之一 - 見下文),其中request代表新狀態。

我看不出_requestURL在上面的代碼中使用,但調用[_webView reload]只會加載經的UIWebView的負載功能之一(即:loadDataloadHTMLString,或loadRequest)加載的最後一頁,或無論上一頁導航到哪裏(無論是通過點擊鏈接還是導航後退/前進)。

+0

謝謝你的提示,克里斯!我們最終最終做了一件事,就像你所說的「完全忽略了UIWebView中內置的goBack和goForward功能」,並用「後退按鈕」直接控制URL。當條件滿足時,我們還使用[_webView loadRequest:request]加載特定頁面。到目前爲止,我們已經得到了我們所希望的。再次感謝克里斯,你的回答讓我們走向了正確的方向! – 2013-03-06 02:05:17