shouldInteractWith 方法中 "URL" 的错误

Bug with "URL" in shouldInteractWith method

我正在尝试使用此委托方法在 UITextView 中捕捉 YouTube URL 以在 Youtube 应用程序上打开它:

func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
    if URL.absoluthePath.contains("youtube.com"), let youtubeURL = URL(string: "youtube://" + id) {
        UIApplication.shared.open(youtubeURL)
    }
}

我有这个错误:

Cannot call value of non-function type 'URL'

因为 Xcode 认为我使用的是 'URL' 变量而不是 URL(string: "")!宣言

您可以使用Foundation.URL

func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
        if let youtubeURL = Foundation.URL(string: "youtube://" + id), URL.absoluteString.contains("youtube.com")  {
            UIApplication.shared.open(youtubeURL)
        }
    }

您的代码中有 3 个问题,但首先这是 Apple 的一个非常糟糕的命名。内部参数标签应为 url(小写)。但是由于内部参数标签是任意的,您可以自己将签名更改为

func textView(_ textView: UITextView, 
                shouldInteractWith url: URL, 
                in characterRange: NSRange, 
                interaction: UITextItemInteraction) -> Bool {

其他问题是:

  • 您必须 return 一个 Bool 值。
  • URL里面没有APIabsoluthePath,你是说absoluteString

更有效的域检查是使用 URL

host 参数
func textView(_ textView: UITextView, shouldInteractWith url: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
    if url.host?.hasSuffix("youtube.com") == true, let youtubeURL = URL(string: "youtube://" + id) {
        UIApplication.shared.open(youtubeURL)
        return true
    }
    return false
}