Ios 如何在新的UIWebView中打开新页面?

Ios 如何在新的UIWebView中打开新页面?,ios,objective-c,uiwebview,Ios,Objective C,Uiwebview,我想在newUIWebViews中打开新网页。例如,当你进入谷歌时,它将被算作一个网页,但当你在谷歌内点击谷歌图片时,它将被算作一个新网页 所有新网页将加载到新的UIWebViews中,并放入包含所有UIWebViews的历史记录数组中 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)nav

我想在new
UIWebViews
中打开新网页。例如,当你进入谷歌时,它将被算作一个网页,但当你在谷歌内点击谷歌图片时,它将被算作一个新网页

所有新网页将加载到新的
UIWebViews
中,并放入包含所有
UIWebViews
的历史记录数组中

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    if (navigationType == UIWebViewNavigationTypeBackForward) {

        // The UIWebView already exists for that page in the history array, call it and display it.
    }
    else if (navigationType == UIWebViewNavigationTypeFormResubmitted) {

        // No problem, load it in the current UIWebView.
    }
    else if (navigationType == UIWebViewNavigationTypeFormSubmitted) {

        // It's a new page, load it in a new UIWebView.
    }
    else if (navigationType == UIWebViewNavigationTypeLinkClicked) {

        // It's a new page, load it in a new UIWebView
    }
    else if (navigationType == UIWebViewNavigationTypeReload) {

        // Just reload the current UIWebView.
    }
    else if (navigationType == UIWebViewNavigationTypeOther) {

        // There's no way this is a new page. Do nothing.
    }
}
正如你可能已经猜到的,它不起作用。您只需遵循以下路径:

  • 单击任意帖子下的twitter共享图标
  • 在twitter上共享的链接如下所示:

    https://twitter.com/intent/tweet?original_referer=http%3A%2F%2F9gag.com%2Fgag%2FaRQpqj2%3Fref%3Dt.mw&source=tweetbutton&text=I%20don%27t%20throw%20the%20word%20%27genius%27%20around%20loosely%2C%20but...&url=http%3A%2F%2F9gag.com%2Fgag%2FaRQpqj2%3Fref%3Dt.mw&via=9GAG
    

    尽管有人会认为这个链接是强的>链接点击< /强>,因为你点击了推特图标去那里,实际上它的类型是“强>其他< /强>,任何桌面网络浏览器都会认为这个链接是弹出式的,并且会在新窗口中打开它。iOS上的Safari在新选项卡中打开此链接。我想在一个新的

    UIWebView
    中打开它,但是问题是,在
    UIWebView
    的委托中,广告请求与弹出请求没有什么区别。

    Safari做得怎么样

    编辑:下面的答案正是
    UIWebView
    的问题所在。它愚弄了所有人,让他们以为代表就是答案,而事实上,即使是最简单的事情,你也只能勉强应付。


    编辑2:我已经与其他浏览器以及Mercury进行了检查,他们都做对了。他们知道Twitter是一个弹出窗口,他们在一个新的标签中打开它。因此,这不是苹果的错。

    将第一个web视图的委托设置为视图控制器。 之后,将以下代码添加到视图控制器中

    - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
    {
        NSLog(@"%@", request.URL);
        NSLog(@"%@", [request.URL scheme]);
        if ([[request.URL scheme] isEqualToString:@"http"])
        {
            // Create web view here, because you're catching all requests
            // Don't forget to set the delegate.
            NSLog(@"Create new web view with %@", request.URL);
            return NO;
        }
    
        return YES;
    }
    
    如您所见,您应该替换我添加NSLog的部分。您可能需要在此时创建一个新的web视图,并将其作为子视图添加到当前视图中


    为什么要检查LinkClicked而不捕获所有请求?

    如果同时加载
    UIWebView
    s,这可能会产生一些非常高的内存使用率,并且更有可能生成一些内存警告。这真的是最好的方法吗?简而言之,是的,有一点内存管理是可能的,但我不想就此争论。如果你为每个
    UIWebViewNavigationTypeLinkClicked
    创建一个新的
    UIWebView
    ,你可能会有数百个,我可以看到,苹果因为内存问题拒绝了这一点,老实说,我建议重新考虑一下你的设计。说真的,我只需要十几个UIWebView。12*20MB=240MB内存。你必须相信我:)十几个网络视图仍然会产生问题。尝试创建一个简单的项目,只添加5个Web视图,加载google并看到内存跃升。不确定这是否真的有帮助,这会产生更多内存问题,正如您所说的,为每个请求创建一个新的
    UIWebView
    ,而不仅仅是
    UIWebViewNavigationTypeLinkClicked
    UIWebViewNavigationTypeFormSubmitted
    -1这真的没用,大力水手这不是我想做的。让我解释一下,这是关于新的页面。弹出页面计为新页面,但它们的类型不是UIWebViewNavigationTypeLinkClicked,也不是UIWebViewNavigationTypeFormSubmitted,它们的类型是(令人惊讶的)UIWebViewNavigationTypeOther,尽管您单击了链接:(好的,我很抱歉。我想你被苹果困住了。这是他们实现UIWebView的方式,我不认为有任何方法可以强制弹出窗口“点击链接”。可能是javascript打开了弹出窗口,所以链接实际上没有被点击。正如我上面提到的,我检查了其他没有被困住的第三方浏览器。