【问题标题】:UIWebView goBack to particular pageUIWebView 返回特定页面
【发布时间】:2013-02-11 19:35:11
【问题描述】:

我遇到了 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,将不胜感激。

编辑

感谢 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];
        }
    }
}

我希望这种方法可以帮助所有面临类似问题的人...

【问题讨论】:

    标签: ios objective-c uiwebview shouldstartload


    【解决方案1】:

    听起来您希望对应用中网页之间的导航进行更精细的控制,而标准的后退/前进功能将无法实现。

    我建议通过完全忽略 UIWebView 中的内置 goBackgoForward 功能来简化问题,并让您的按钮委托给“StateManager”类型的对象 - 基于应用程序的当前状态以及用户试图去哪个方向,您就知道应该产生哪个状态(即:要加载哪个页面)。

    要加载新状态,只需使用[_webView loadRequest:request](或其他加载函数之一 - 见下文),其中request 代表新状态。

    我没有看到_requestURL 在上面的代码中是如何使用的,但是调用[_webView reload] 只会加载通过 UIWebView 加载函数之一加载的最后一页(即:loadData、@987654322 @,或loadRequest),或之后导航到的最后一页是什么(通过单击链接或向后/向前导航)。

    【讨论】:

    • 感谢您的提示,克里斯!我们最终按照您所说的“完全忽略了 UIWebView 中内置的 goBack 和 goForward 功能”,并使用“后退按钮”直接控制 URL。我们还使用 [_webView loadRequest:request] 在满足条件时加载特定页面。到目前为止,我们已经得到了我们所希望的。再次感谢克里斯,您的回答将我们引向了正确的方向!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 2012-05-02
    • 2018-02-15
    • 1970-01-01
    相关资源
    最近更新 更多