Метод делегата TextView не вызывается

Весь мой код, за исключением метода делегата, работает нормально (я добавил дополнительный код для контекста), но вы можете игнорировать его, если хотите, и сосредоточиться на ifs/else ifs и методе делегата.

Предполагается, что метод делегата вызывается при нажатии на ссылку (ссылка и атрибут ссылки работают хорошо), но метод делегата по какой-то причине не вызывается. Может кто-нибудь, пожалуйста, скажите мне, почему и что мне нужно сделать, чтобы это исправить.

    let words = formulaTextView.text
    let split = words?.split(separator: " ")
    let last2words = String((split?.suffix(2).joined(separator: " "))!)
    let first2words = String((split?.prefix(2).joined(separator: " "))!)
    let firstWord = String((split?.prefix(1).joined(separator: " "))!)
    let lastWord = String((split?.suffix(1).joined(separator: " "))!)
    let first3Words = String((split?.prefix(3).joined(separator: " "))!)
    let last3Words = String((split?.suffix(3).joined(separator: " "))!)
    let listOfWords =              [first2words,last2words,lastWord,firstWord,last3Words,first3Words]
    formulaTextView.text = "Formula: \(words!)"
    var y: NSMutableAttributedString?
    for k in listOfWords {
if termStrings.contains(k) {
    if words!.contains(k) && y == nil {             
        let textViewAttributedString = NSMutableAttributedString(string: formulaTextView.text!)
        textViewAttributedString.addAttribute(.font, value: UIFont(name: "Arial", size: 14.0)!, range: NSMakeRange(0, textViewAttributedString.length))
        let attributedString = NSMutableAttributedString(string: k)
        
        attributedString.addAttribute(.font, value: UIFont(name: "Arial", size: 14.0)!, range: NSMakeRange(0, attributedString.length))
        attributedString.addAttribute(.underlineStyle, value: 1, range: NSMakeRange(0, attributedString.length))
        attributedString.addAttribute(.underlineColor, value: UIColor.link, range: NSMakeRange(0, attributedString.length))
        attributedString.addAttribute(.foregroundColor, value: UIColor.link, range: NSMakeRange(0, attributedString.length))
        attributedString.addAttribute(.link, value: k, range: NSMakeRange(0, attributedString.length))
        
        formulaTextView.linkTextAttributes = [.foregroundColor: UIColor.link, .font: UIFont(name: "Arial", size: 14.0)!]
        
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.alignment = .left

        let range = textViewAttributedString.string.range(of: k)!
        let nsrange = NSRange(range, in: textViewAttributedString.string)
        
        textViewAttributedString.replaceCharacters(in: nsrange, with: attributedString)
        
        y = textViewAttributedString
        
        textViewAttributedString.addAttribute(.paragraphStyle, value: paragraphStyle, range: NSMakeRange(0, textViewAttributedString.length))
        
        formulaTextView.attributedText = textViewAttributedString
        
    }
    else if words!.contains(k) && y != nil {
        
        let attributedString = NSMutableAttributedString(string: k)
        
        attributedString.addAttribute(.font, value: UIFont(name: "Arial", size: 14.0)!, range: NSMakeRange(0, attributedString.length))
        attributedString.addAttribute(.underlineStyle, value: 1, range: NSMakeRange(0, attributedString.length))
        attributedString.addAttribute(.underlineColor, value: UIColor.link, range: NSMakeRange(0, attributedString.length))
        attributedString.addAttribute(.foregroundColor, value: UIColor.link, range: NSMakeRange(0, attributedString.length))
        attributedString.addAttribute(.link, value: k, range: NSMakeRange(0, attributedString.length))
        
        formulaTextView.linkTextAttributes = [.foregroundColor: UIColor.link, .font: UIFont(name: "Arial", size: 14.0)!]
        
        
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.alignment = .left
        
        let range = y!.string.range(of: k)!
        let nsrange = NSRange(range, in: y!.string)
        
        y!.replaceCharacters(in: nsrange, with: attributedString)
        
        y!.addAttribute(.paragraphStyle, value: paragraphStyle, range: NSMakeRange(0, y!.length))
        
        
        formulaTextView.attributedText = y!
    }
   }



    // Do any additional setup after loading the view.
}

formulaTextView.isEditable = false
formulaTextView.isSelectable = true
formulaTextView.isUserInteractionEnabled = true
formulaTextView.delegate = self

func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
    print("hello world")
    return false
}

person Neel1005    schedule 24.09.2020    source источник
comment
В зависимости от listOfWords он может быть связан с stackoverflow.com/questions/64041434/ Тестируете? listOfWords.forEach{ if URL(string: $0) == nil { print("it won't work for \($0)" }}   -  person Larme    schedule 25.09.2020
comment
URL-адрес не должен быть действительным. Я хочу, чтобы он запускал функцию делегата при нажатии на текст. Есть ли способ сделать это?   -  person Neel1005    schedule 25.09.2020
comment
Создайте поддельный URL, чтобы заставить его работать. В любом случае, вы вернете false в методе делегата, так что вам все равно. Например, fake://Hello%20world, где k будет Hello world.   -  person Larme    schedule 25.09.2020
comment
Я попытался с допустимым URL-адресом, и хотя я возвращаю false в методе делегата, я все еще получаю эту ошибку «Не удалось открыть URL-адрес www.apple.com: Error Domain = NSOSStatusErrorDomain Code =-50 недопустимые входные параметры UserInfo = {NSDebugDescription = неверные входные параметры, _LSLine=252, _LSFunction=-[_LSDOpenClient openURL:options:completionHandler:]}'   -  person Neel1005    schedule 25.09.2020
comment
Может кто-нибудь сказать мне, почему это происходит?   -  person Neel1005    schedule 25.09.2020
comment
Это ошибка на iOS13, на iOS12.4 (по крайней мере, симуляторы, я не проверял на реальном устройстве) такой ошибки не было. Я думаю, вы можете игнорировать это.   -  person Larme    schedule 25.09.2020
comment
@Larme поддельный URL-адрес не работал, он выдавал «найден ноль при развертывании необязательного значения»   -  person Neel1005    schedule 25.09.2020
comment
Ну, у меня все получилось, вы избежали процента, если это необходимо? Какая строка вызвала эту ошибку? какое слово?   -  person Larme    schedule 25.09.2020
comment
Итак, метод делегата работает   -  person Neel1005    schedule 25.09.2020
comment
@Larme, эта строка была строкой, которая добавляла атрибуты ссылки в NSMutableAttributedString, также я добавил логику, чтобы процент экранировал значение, если был пробел   -  person Neel1005    schedule 25.09.2020
comment
Я не могу догадаться, что не так, но я бы выбрал URL(string: "fake://\(k.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!)"), но я бы заранее проверил, действительно ли k.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) не равен нулю с разверткой if let.   -  person Larme    schedule 25.09.2020