禁用UIWebView中的链接?

问题描述 投票:19回答:7

我正在将一些内容从网络加载到UIWebView,但我希望在UIWebView中禁用所有链接。这可能吗?我可以解析文本,但我正在寻找更容易的东西。

iphone uiwebview hyperlink
7个回答
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;
}

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];

1
投票

对于swift 3:

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

webView.dataDetectorTypes.remove(UIDataDetectorTypes.all)

0
投票

简单的答案适用于Swift 2.0:

yourWebView.dataDetectorTypes = UIDataDetectorTypes.None

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


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方法,用户可以在此“短”间隔内导航。


0
投票

Swift 3.0的另一个答案: 只要给出零,不要检测yourWebView初始代码的任何类型链接

yourWebView.dataDetectorTypes =  UIDataDetectorTypes(rawValue: 0)
© www.soinside.com 2019 - 2024. All rights reserved.