我正面臨着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];
}
}
}
我希望這種方法可以幫助所有人面臨類似的問題...
謝謝你的提示,克里斯!我們最終最終做了一件事,就像你所說的「完全忽略了UIWebView中內置的goBack和goForward功能」,並用「後退按鈕」直接控制URL。當條件滿足時,我們還使用[_webView loadRequest:request]加載特定頁面。到目前爲止,我們已經得到了我們所希望的。再次感謝克里斯,你的回答讓我們走向了正確的方向! – 2013-03-06 02:05:17