【发布时间】:2010-10-19 21:09:26
【问题描述】:
我有一个小的嵌入式 UIWebView 用于应用程序的 about 部分。当用户点击其中的链接时,该链接会在那个小的嵌入式 UIWebView 中打开,它当然没有导航控件并且不是全屏的。我不喜欢那样。我可以强制它用 Safari 打开链接吗?
【问题讨论】:
我有一个小的嵌入式 UIWebView 用于应用程序的 about 部分。当用户点击其中的链接时,该链接会在那个小的嵌入式 UIWebView 中打开,它当然没有导航控件并且不是全屏的。我不喜欢那样。我可以强制它用 Safari 打开链接吗?
【问题讨论】:
可以实现UIWebViewDelegate协议的shouldStartLoadWithRequest方法来拦截链接点击。在该方法中,您可以使用 UIApplication 的 openURL 方法在适当的应用程序中打开 url(即用于 HTTP/HTTPS 的 Safari)。
- (BOOL) webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
NSURL *url = [request URL];
if ([url isEqual:YOUR_HOME_URL_CONTSTANT])
return YES;
[[UIApplication sharedApplication] openURL:url];
return NO;
}
【讨论】:
你应该实现 UIWebViewDelegate 的shouldStartLoadWithRequest。在这里,您可以看到 UIWebView 何时开始加载 URL。然后你可以处理哪些应该在这个 webView 中加载,哪些应该由 Safari 加载。
我的代码如下:
-(BOOL) webView:(UIWebView *)inWeb shouldStartLoadWithRequest:(NSURLRequest *)inRequest navigationType:(UIWebViewNavigationType)inType
{
if (inType != UIWebViewNavigationTypeLinkClicked)
{
//This was not a clicked link, so is probably the initial load
//and should be loaded in the UIWebView
return YES;
}
//This was a clicked link, so load using Safari
[[UIApplication sharedApplication] openURL:[inRequest URL]];
return NO;
}
这里我使用UIWebViewNavigationType 来确定是否是链接点击,并做出适当的响应。
【讨论】: