SwiftUI Text Markdown 动态字符串不起作用

gao*_*way 18 text swiftui

我想动态传送内容并显示超链接,但它不能动态传送并且不能工作

\n
let linkTitle = "Apple Link"\nlet linkURL = "http://www.apple.com"\nlet string = "[Apple Link](http://www.apple.com)"\n            \nText(string)        // Not working\n\nText("[Apple Link](http://www.apple.com)")  // Working\n            \nText("[\\(linkTitle)](http://www.apple.com)")    // Working\n            \nText("[\\(linkTitle)](\\(linkURL))")  // Not working\n            \n
Run Code Online (Sandbox Code Playgroud)\n

kga*_*dis 22

简答

将字符串包裹在AttributedString(markdown: my_string_here)

let string: String = "[Apple Link](http://www.apple.com)"
Text(try! AttributedString(markdown: string))
Run Code Online (Sandbox Code Playgroud)

扩大

extension String {
  func toMarkdown() -> AttributedString {
    do {
      return try AttributedString(markdown: self)
    } catch {
      print("Error parsing Markdown for string \(self): \(error)")
      return AttributedString(self)
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

长答案

SwiftUIText有多个初始化器。

为了String

init<S>(_ content: S) where S : StringProtocol
Run Code Online (Sandbox Code Playgroud)

为了AttributedString

init(_ attributedContent: AttributedString)
Run Code Online (Sandbox Code Playgroud)

当你声明一个静态字符串时,Swift 能够猜测其意图是否是使用Stringor AttributedString(Markdown)。但是,当您使用动态字符串时,Swift 需要帮助来确定您的意图。

因此,对于动态字符串,您必须将您显式转换StringAttributedString

try! AttributedString(markdown: string)
Run Code Online (Sandbox Code Playgroud)


Raj*_*han 15

在文本中添加另一个.init

struct ContentView: View {
    
    let linkTitle = "Apple Link"
    let linkURL = "http://www.apple.com"
    let string = "[Apple Link](http://www.apple.com)"
    
    var body: some View {
    
        Text(.init(string))     // <== Here!
        
        Text("[Apple Link](http://www.apple.com)")  // Working
        
        Text("[\(linkTitle)](http://www.apple.com)")    // Working
        
        Text(.init("[\(linkTitle)](\(linkURL))"))  // <== Here!
    }
}
Run Code Online (Sandbox Code Playgroud)


wor*_*dog 7

您可以尝试以下内容:How to show HTML or Markdown in a SwiftUI Text? 页面的中间位置。

extension String {
    func markdownToAttributed() -> AttributedString {
        do {
            return try AttributedString(markdown: self) /// convert to AttributedString
        } catch {
            return AttributedString("Error parsing markdown: \(error)")
        }
    }
}
struct ContentView: View {
    let linkTitle = "Apple Link"
    let linkURL = "https://www.apple.com"
    let string = "[Apple Link](https://www.apple.com)"
       
    @State var textWithMarkdown = "[Apple Link](https://www.apple.com)"
    
    var body: some View {
        VStack {

            Text(textWithMarkdown.markdownToAttributed()) // <-- this works
            
            Text(string)        // Not working

            Text("[Apple Link](http://www.apple.com)")  // Working
                        
            Text("[\(linkTitle)](http://www.apple.com)")    // Working
                        
            Text("[\(linkTitle)](\(linkURL))")  // Not working
        }

    }
}
Run Code Online (Sandbox Code Playgroud)