【问题标题】:Disable links in UIWebView?禁用 UIWebView 中的链接?
【发布时间】:2011-01-07 02:44:33
【问题描述】:

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

【问题讨论】:

  • 您可以通过在您的 web 视图中运行 javascript sn-p 来做到这一点,-[UIWebView stringByEvaluatingJavaScriptString:].
  • 你知道这个脚本吗?

标签: iphone uiwebview hyperlink


【解决方案1】:

您可以给UIWebView 一个delegate 并将-webView:shouldStartLoadWithRequest:navigationType: 委托方法实现给return NO;(初始加载除外)。

这将阻止用户查看除该单个页面之外的任何内容。

提供 cmets 中要求的示例...以 allowLoad=YES 开头,然后:

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType {
    return allowLoad;
}

- (void)webViewDidFinishLoad:(UIWebView*)webView {
    allowLoad = NO;
}

【讨论】:

  • 如何避免这种情况只用于初始加载?
  • @Praveen 我首先返回一个变量,该变量最初是 YES,但在 -webViewDidFinishLoad: 中设置为 NO
  • 不,我不明白,webViewDidFinishLoad 不是布尔方法。那么,我们怎样才能回到那里呢?
  • @Praveen 我是说您使用-webViewDidFinishLoad 被调用的事实作为第一次加载完成的指示。一旦调用了该方法,您就知道以后可以从shouldStartLoadWithRequest:... 方法返回NO
  • 好的。有没有与此相关的例子?
【解决方案2】:

在 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
}

【讨论】:

    【解决方案3】:

    您可以从您的网络视图禁用数据检测。

    [webView setDataDetectorTypes:UIDataDetectorTypeNone];
    

    【讨论】:

    • RainCast 你的意思是从 webview 打开 youtube 应用程序还是只是 youtube 网页?
    【解决方案4】:

    对于 Swift 3:

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

    webView.dataDetectorTypes.remove(UIDataDetectorTypes.all)
    

    【讨论】:

    • 请在您的答案中添加一些解释,而不是只发布一行(未格式化的)代码。
    • @FabianSchöner 我编辑添加了一些解释并添加了格式。该解决方案有效,投票否决会使人们认为该解决方案是错误的,而不是尝试该解决方案。
    • 我没有投反对票,我只是添加了评论。感谢您通过编辑答案使事情变得清晰!
    【解决方案5】:

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

    yourWebView.dataDetectorTypes =  UIDataDetectorTypes(rawValue: 0)
    

    【讨论】:

    • 您的回答节省了我的时间。
    【解决方案6】:

    适用于 Swift 2.0 的简单答案:

    yourWebView.dataDetectorTypes = UIDataDetectorTypes.None
    

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

    【讨论】:

    • @RainCast 您是否为 YouTube 找到了解决方案(以防止进入现场并仅显示视频)?
    【解决方案7】:

    我也有类似的需求,在某些情况下仅使用 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 方法,并且用户可以在这个“短”间隔内导航。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多