I'm using a HTMLView from this answer
But sometimes I have a link, if I click that opens Safari
Does exist in SwiftUI some delegate to catch the link with this HTMLView?
I'm using a HTMLView from this answer
But sometimes I have a link, if I click that opens Safari
Does exist in SwiftUI some delegate to catch the link with this HTMLView?
You can set the UITextDelegate
of the UITextView
to the Coordinator
of the UIViewRepresentable
. Then, you can decide how to process URLs in shouldInteractWith
. If you return false
, the system will not use Safari to navigate to the URL.
struct HTMLFormattedText: UIViewRepresentable {
let text: String
init(_ content: String) {
self.text = content
}
class Coordinator : NSObject, UITextViewDelegate {
func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
print(URL)
return false
}
}
func makeUIView(context: UIViewRepresentableContext<Self>) -> UITextView {
let textView = UITextView()
textView.delegate = context.coordinator
return textView
}
func updateUIView(_ uiView: UITextView, context: UIViewRepresentableContext<Self>) {
DispatchQueue.main.async {
if let attributeText = self.converHTML(text: text) {
uiView.attributedText = attributeText
} else {
uiView.text = ""
}
}
}
func makeCoordinator() -> Coordinator {
return Coordinator()
}
private func converHTML(text: String) -> NSAttributedString?{
guard let data = text.data(using: .utf8) else {
return nil
}
if let attributedString = try? NSAttributedString(data: data, options: [.documentType: NSAttributedString.DocumentType.html], documentAttributes: nil) {
return attributedString
} else{
return nil
}
}
}
struct ContentView: View {
var body: some View {
HTMLFormattedText("Test<br/><a href=\"https://google.com\">Google</a>")
}
}