如何使用导航控制器作为我的UIWebView [Xcode]的导航?

时间:2012-11-22 16:42:34

标签: ios xcode uiwebview uinavigationcontroller storyboard

我正在处理iOS应用的更新。 目前您可以使用静态后退按钮(在我的故事板中创建和链接)返回,但我希望通过导航控制器重定向到新的WebView。 这是目前的代码:

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSURL *url = [NSURL URLWithString:@"http://example.com"];

    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [self.navigationController pushViewController:url animated:YES];

    [webView loadRequest:request];
}

我该怎么做? 非常感谢你提前!!

最高

1 个答案:

答案 0 :(得分:0)

显然,这段代码没有意义(例如url不是UIViewController所要求的pushViewController等等,但我们可以对你所做的事情做出明智的猜测试图做。我猜你说你想让后退按钮像网页浏览器上的后退按钮一样,但你希望标准导航控制器能够为你做好准备。这意味着您还建议每次单击页面上的链接时,您希望推送到另一个视图控制器以显示下一个网页(以便后退按钮可以将您带回到上一个使用上一个网页查看控制器。)

如果这就是你问的问题,那可能不是一个好主意。这意味着每次您点击网络浏览器中的链接时,您都需要使用UIWebViewDelegate方法shouldStartLoadWithRequest拦截该请求,而不是让当前UIWebView满意该请求,而是推送到另一个视图控制器与UIWebView启动该页面。可悲的是,这是很多工作,并且令人难以置信地浪费了内存资源。它也不适用于很多网页。底线,不是一个好主意。

将按钮添加到托管UIWebView的视图控制器更容易,然后让UIWebView完成它的所有魔力。然后,您可以添加用户在iOS网络浏览器上增长的所有其他按钮(不仅是后退按钮,还可以是前进按钮,可能是主页按钮,可能是“操作”按钮,可让您在Safari中打开页面,在fb上分享等等。无论你想要什么。但用户期望的不仅仅是一个“后退”按钮。


<强>更新

如果您真的想在用户点击链接时推送到另一个视图控制器,您可以截取shouldStartLoadWithRequest,如前所述。但是,以下代码示例假定:

  • 您已将视图控制器定义为Web视图的委托;和
  • 您已定义BOOL个实例变量loadFinished

无论如何,您可能需要这三种UIWebViewDelegate方法:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    if (!initialLoadFinished)
    {
        // if we're still loading this web view for the first time, then let's let
        // it do it's job

        return YES;
    }
    else
    {
        // otherwise, let's intercept the webview from going to the next
        // html link that the user tapped on, and create the new view controller.

        // I'm making the next controller by instantiating a scene from the
        // storyboard. Because you may be using NIBs or because you have different
        // class names and storyboard ids, you will have to change the following
        // line.

        ViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"webview"];

        // I don't know how you're passing the URL to your view controller. I'm
        // just setting a (NSString*)urlString property.

        controller.urlString = request.URL.absoluteString;

        // push to that next controller

        [self.navigationController pushViewController:controller animated:YES];

        // and stop this web view from navigating to the next page

        return NO;
    }
}

// UIWebView calls this when the page load is done

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    initialLoadFinished = YES;
}

// UIWebView calls this if the page load failed. Note, though, that
// NSURLErrorCancelled is a well error that some web servers erroneously
// generate

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
{
    if (error.code != NSURLErrorCancelled)
    {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Web Loading Error"
                                                        message:nil // error.localizedDescription
                                                       delegate:nil
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil];
        [alert show];

        initialLoadFinished = YES;
    }
}

就个人而言,我可能会坚持使用标准UIWebView,但如果你想跳转到导航控制器,就可以了。顺便说一下,上面的hack可能无法很好地处理重定向,所以请确保你正确的URL。