我正在将一些内容从网络加载到UIWebView
,但我希望在UIWebView
中禁用所有链接。这可能吗?我可以解析文本,但我正在寻找更容易的东西。
答案 0 :(得分:53)
您可以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;
}
答案 1 :(得分:11)
在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
}
答案 2 :(得分:4)
您可以从网络视图中禁用数据检测。
[webView setDataDetectorTypes:UIDataDetectorTypeNone];
答案 3 :(得分:1)
对于swift 3:
尝试删除您不希望显示为webView.dataDetectorTypes
webView.dataDetectorTypes.remove(UIDataDetectorTypes.all)
答案 4 :(得分:0)
简单的答案适用于Swift 2.0:
yourWebView.dataDetectorTypes = UIDataDetectorTypes.None
只需在您定义和使用Web视图的视图控制器中实现它,它就能完美运行。
答案 5 :(得分:0)
我有类似的需求,在某些情况下仅仅使用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
}
在某些情况下,当加载html时,某些资源(如图像和DOM内部的一些重要资源)并未触发didFinishLoad方法,用户可以在此“短”间隔内导航。
答案 6 :(得分:0)
Swift 3.0的另一个答案:
只需为零检测即可检测到您的WebView初始代码的任何类型链接
yourWebView.dataDetectorTypes = UIDataDetectorTypes(rawValue: 0)