我遇到了 UIWebView 的 goBack 函数的问题。
我的要求是当用户按下一个按钮(称为“后退按钮”)时,我必须在某些条件下将用户重定向到特定页面。把它想象成一个“购物车系统”:当用户在“菜单”页面时,他选择了一个项目并“将一个项目添加到购物车”。当他点击“删除一个项目”时,然后转到“该项目被删除”页面。当用户单击“返回按钮”时,用户应该返回“菜单”而不是空购物车页面。
为了解决这个问题,我考虑使用“队列”来保存 URL 历史记录,然后用户在某些条件下按下“返回按钮”,从“队列”重新加载 URL。
由于这个答案,我用入队/出队函数制作了自定义 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,将不胜感激。
编辑
感谢 Chris 的提示,我们终于成功控制了“返回按钮”,如下所示:
- (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];
}
}
}
我希望这种方法可以帮助所有面临类似问题的人......