我正在从Web加载一些内容到
UIWebView
中,但我想在UIWebView
中禁用所有链接。这可能吗?我可以解析文本,但我正在寻找更简单的方法。你可以为UIWebView
设置一个委托对象(delegate),并实现-webView:shouldStartLoadWithRequest:navigationType:
代理方法,将其return NO;
(除了初始加载)。
这将防止用户查看除该单个页面以外的任何内容。
提供在评论中请求的示例... 首先将allowLoad=YES
,然后:
- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType {
return allowLoad;
}
- (void)webViewDidFinishLoad:(UIWebView*)webView {
allowLoad = NO;
}
YES
,但在 -webViewDidFinishLoad:
中设置为 NO
。 - Dave DeLong-webViewDidFinishLoad
被调用这一事实作为第一次加载完成的指示。一旦该方法被调用,你就知道以后可以从 shouldStartLoadWithRequest:...
方法中返回 NO
。 - Dave DeLong在 Swift 4.0 中测试通过:此方法不涉及使用额外的变量来测试是否为初始加载。只需检查请求的类型(在本例中为 LinkClicked),并在该情况下返回 false。否则,只需返回 true!
(当然,确保设置 webView.delegate
)
func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
if navigationType == .linkClicked {
return false
}
return true
}
[webView setDataDetectorTypes:UIDataDetectorTypeNone];
yourWebView.dataDetectorTypes = UIDataDetectorTypes(rawValue: 0)
针对Swift 3:
尝试从webView.dataDetectorTypes
中删除您不想显示为链接的类型。
webView.dataDetectorTypes.remove(UIDataDetectorTypes.all)
Swift 2.0 中可行的简单答案:
yourWebView.dataDetectorTypes = UIDataDetectorTypes.None
只需在定义和使用您的 Web 视图的视图控制器中实现它,它就会无缝运行。
我有类似的需求,但有些情况下仅使用webViewDidFinishLoad是不够的,因此我使用了webViewDidStartLoad来覆盖所有情况:
func webViewDidStartLoad(webView: UIWebView) {
startedLoading = true
}
func webViewDidFinishLoad(webView: UIWebView) {
alreadyOpen = true
}
func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
if startedLoading && alreadyOpen {
// do something
return false
}else if startedLoading && !alreadyOpen{
return false
}else if !startedLoading {
return true
}
return true
}
-[UIWebView stringByEvaluatingJavaScriptString:]
方法即可。 - Ben Gottlieb