禁用UIWebView中的链接?

19
我正在从Web加载一些内容到UIWebView中,但我想在UIWebView中禁用所有链接。这可能吗?我可以解析文本,但我正在寻找更简单的方法。

您可以通过在Web视图中运行JavaScript代码片段来实现此操作,使用-[UIWebView stringByEvaluatingJavaScriptString:]方法即可。 - Ben Gottlieb
你知道这个脚本吗? - Hiren
7个回答

54

你可以为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;
}

如何仅在初始加载时避免这种情况? - Praveenkumar
2
@Praveen 我会从返回一个变量开始,这个变量最初是 YES,但在 -webViewDidFinishLoad: 中设置为 NO - Dave DeLong
不,我不理解,“webViewDidFinishLoad”不是布尔方法。那么,我们怎么返回呢? - Praveenkumar
@Praveen 我的意思是你可以利用 -webViewDidFinishLoad 被调用这一事实作为第一次加载完成的指示。一旦该方法被调用,你就知道以后可以从 shouldStartLoadWithRequest:... 方法中返回 NO - Dave DeLong
好的。有相关的例子吗? - Praveenkumar
在加载初始页面之前,设置 **allowLoad = YES;**。一旦初始页面加载完成(在 webViewDidFinishLoad 中),设置 "allowLoad = NO;"。这样,就不会再加载其他页面了。 - NSPratik

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
}

4
您可以在Webview中禁用数据检测。
[webView setDataDetectorTypes:UIDataDetectorTypeNone];

RainCast,您是指从Webview打开YouTube应用程序还是仅打开YouTube网页? - Chris Ho

1
另一个 Swift 3.0 的解决方案:
在你的 WebView 初始代码中,将检测任何类型链接的值设为零。
yourWebView.dataDetectorTypes =  UIDataDetectorTypes(rawValue: 0)

1

针对Swift 3:

尝试从webView.dataDetectorTypes中删除您不想显示为链接的类型。

webView.dataDetectorTypes.remove(UIDataDetectorTypes.all)

1
请在您的答案中添加一些解释,而不仅仅是发布一行(未格式化)的代码。 - Fabian S.
@FabianSchöner 我进行了编辑以添加一些解释,并进行了格式化。这个解决方案是可行的,否则对它进行投票会让人们认为这个解决方案是错误的,不会尝试这个解决方案。 - Jeremiah Widjaja
我没有给你的回答点踩,我只是添加了评论。感谢您通过编辑您的回答使事情更加清晰! - Fabian S.

0

Swift 2.0 中可行的简单答案:

yourWebView.dataDetectorTypes = UIDataDetectorTypes.None

只需在定义和使用您的 Web 视图的视图控制器中实现它,它就会无缝运行。


@RainCast,你找到了YouTube的解决方案吗(以防止进入网站并仅显示视频)? - user25

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方法不会触发,用户可以在这个“短”间隔内导航。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接