How do I get a link to work in a list with words before it that’s not hyperlinked?
Text("Telephone: [Privacy Policy](https://example.com)")
except the link needs to allow me to make it dynamic… (variable).website. - For instance
I tried doing this too, but it just makes the whole thing text.
let wb = "[Privacy Policy](https://example.com)"
List {
Text("Telephone:2 " + wb)
I know about what’s below, but don’t know how to combine text with it that’s not hyperlinked
Link("Website: ", destination: URL(string: base.website)!)
You could use an HStack.
HStack(spacing: 0) {
Text("My text")
Link("Website: ", destination: URL(string: base.website)!)
}
Text
can display links when you feed it an AttributedString
. When you give it a static String
that contains markdown, it assumes you really want an AttributedString
and converts it for you.
The problem is that when you use a dynamic String
(i.e., one you build on the fly) to initialize a Text
, SwiftUI can’t tell if you want a String
or an AttributedString
. So you have to help it along.
You can do something like this:
struct MarkdownLink: View {
let wb = "https://example.com"
var markdownLink: AttributedString {
try! AttributedString(markdown: "Telephone: [Privacy Policy](\(wb))")
}
var body: some View {
Text(markdownLink)
}
}
In other words, build your AttributedString
in a computed variable and feed that to Text
so there’s no ambiguity about what you want.
You could even do away with the computed variable altogether by doing:
Text(try! AttributedString(markdown: "Telephone: [Privacy Policy](\(wb))"))
but I find that kind of icky.
Of course, you could improve this by changing the try!
to try
and adding some error handling in case the conversion to AttributedString
fails, but I’ll leave that as an exercise for the reader.
I tried something similar. My problem, which I may have to fix in a different way is below. I may just have to add the tele: part into json…
let comm = "tele:\(base.Commercial)"
var commercialLink: AttributedString {
try! AttributedString(markdown: "Telephone: [Privacy Policy](\(comm))")
}

For your similar example, I found this on stackoverflow:
Text("[Privacy Policy](https://example.com)")
I tried your option too, but it’ll crash saying it unexpectedly found nil while unwrapping an Optional Value. (Which I don’t get cause it’s not optional in my model. And I also don’t understand why it’s claiming nil when right above that suggested code, I use that same base.website as a text field and shows fine. So it’s obviously not nil.
tele:(301) 981-3604
is not a valid telephone URL.
It should be tel:3019813604
.
1 Like
base.website
may not be nil
but URL(string: base.website)
apparently is.
Whatever base.website
is, it doesn’t convert to a valid URL and so URL(string:)
returns nil
. So when you force unwrap it, you get that error.
1 Like
I must have misspoken, it only crashes when I attempt “tele:” + base.commercial. It does not crash with base.website because that’s just a traditional url (http://…)
Your first response tells me what I need though - will make those adjustments to json itself and then should be good. Thank you for your help Roosterboy