Ios 如何在新的UIWebView中打开新页面?
我想在newIos 如何在新的UIWebView中打开新页面?,ios,objective-c,uiwebview,Ios,Objective C,Uiwebview,我想在newUIWebViews中打开新网页。例如,当你进入谷歌时,它将被算作一个网页,但当你在谷歌内点击谷歌图片时,它将被算作一个新网页 所有新网页将加载到新的UIWebViews中,并放入包含所有UIWebViews的历史记录数组中 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)nav
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.
}
}
正如你可能已经猜到的,它不起作用。您只需遵循以下路径:
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打开了弹出窗口,所以链接实际上没有被点击。正如我上面提到的,我检查了其他没有被困住的第三方浏览器。