【问题标题】:UITextView Hyperlink to Internal WebViewUITextView 到内部 WebView 的超链接
【发布时间】:2017-03-19 21:19:17
【问题描述】:

UITextView 允许基于attributedText 的可点击超链接。通过实现委托方法可以拦截用户与链接的交互。 textView:shouldInteractWithURL:in: 有两种变体,适用于 iOS 10 和一种适用于 iOS 9,如下所示。

// For iOS 9 and below.
@available(iOS, deprecated=10.0)
func textView(textView: UITextView, shouldInteractWith URL: NSURL, in characterRange: NSRange) -> Bool {
    // Present UIWebView here...
    return false
}

@available(iOS 10.0, *)
func textView(textView: UITextView, shouldInteractWithURL URL: NSURL, inRange characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
    // Present UIWebView here...
    return false
}

iOS 10 中运行应用程序时,iOS 10 的回调有效,但在 iOS 9 中,其他回调永远不会被调用。它直接启动 safari。

我尝试了@available 属性的各种组合,但没有任何效果。代表根本不会被调用iOS 9

应用的Deployment TargetiOS 9,使用Xcode 8Base SDKiOS 10.2

更新 我正在使用 Swift 2.3

【问题讨论】:

    标签: ios iphone swift xcode deprecated


    【解决方案1】:

    由于提问者使用的是 Swift 2.3,我们需要使用它的方法签名版本。我已经更新了下面的代码 sn-p。如果您使用的是 Swift 3,则需要从参数名称中删除 URLRange

    根据文档,iOS 9 版本和 iOS 10 版本的唯一区别是 iOS 10 版本多了一个interaction: 参数。

    // For iOS 9 and below.
    @available(iOS, deprecated=10.0)
    func textView(textView: UITextView, shouldInteractWithURL URL: NSURL, inRange characterRange: NSRange) -> Bool {
        // Present UIWebView here...
        return false
    }
    
    @available(iOS 10.0, *)
    func textView(textView: UITextView, shouldInteractWithURL URL: NSURL, inRange characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
        // Present UIWebView here...
        return false
    }
    

    【讨论】:

    • 我现在使用的是 swift 2.3,我认为签名的不同是因为这个。我确实有 iOS 10 的附加参数,它确实在 iOS 10 模拟器中工作,正如我在问题中提到的那样。我也试试这个。是的,我已经使用了断点,并且似乎没有在 iOS 9 模拟器或设备中使用任何一种方法。
    • 它成功了,非常感谢。尽管我使用 Xcode 代码完成来实现这些方法,但它仍然为我提供了 in 而不是 inRange
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 2012-10-04
    • 2017-01-07
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    • 2021-09-12
    相关资源
    最近更新 更多