3

我有这个使用“ShouldInteractWith”方法的自定义 UITextView:

class StudyText: UITextView,  UITextViewDelegate {
    func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
        print(URL)

        return false
    }
}

struct ClickableText: UIViewRepresentable {
    @Binding var text: NSMutableAttributedString

    func makeUIView(context: Context) -> StudyText {
        let view = StudyText()

        view.dataDetectorTypes = .all
        view.isEditable        = false
        view.isSelectable      = true
        view.delegate          = view
        view.isUserInteractionEnabled = true

        return view
    }

    func updateUIView(_ uiView: StudyText, context: Context) {
        uiView.attributedText = text

    }
}

我有这个扩展来设置属性文本的链接:

extension NSMutableAttributedString {

    func apply(link: String, subString: String)  {
        if let range = self.string.range(of: subString) {
            self.apply(link: link, onRange: NSRange(range, in: self.string))
        }
    }
    private func apply(link: String, onRange: NSRange) {
        self.addAttributes([NSAttributedString.Key.link: link], range: onRange)
    }

}

我创建了这个布局:

struct contentView: View {
    @State text: NSMutableAttributedString = NSMutableAttributedString(string: "")

    var body: some View {
        VStack {
             ClickableText(text: self.$text)
        }
        .onAppear{

             let myText = "Click Me!"

             let attributedString = NSMutableAttributedString(string: myText)
             attributedString.apply(link: "Soeme random link", subString: myText)

             self.text = attributedString

        }
    }
}

当我单击文本视图时,它不会向控制台打印任何内容,有时它会崩溃。我怎样才能解决这个问题?

4

1 回答 1

1

必须提供有效的 URL,例如

 let attributedString = NSMutableAttributedString(string: myText)
 attributedString.apply(link: "https://www.google.com", subString: myText)
于 2020-06-05T17:30:21.650 回答