SwiftUI中如何让AttributedString同时保留Markdown格式与换行符?
解决SwiftUI中AttributedString解析Markdown时丢失换行的问题
要同时保留Markdown格式(如斜体)和原文本的换行符,有两种可行方案:
方案一:修改文本适配Markdown硬换行规则
Markdown规范中,段落内的硬换行需要在换行前添加两个空格。我们可以先将原文本中的\n替换为 \n(两个空格加换行),再进行AttributedString转换:
struct DetailTabView: View { var text: String var body: some View { // 替换原换行符为Markdown硬换行格式 let processedText = text.replacingOccurrences(of: "\n", with: " \n") // 用do-catch处理解析错误,避免try!导致崩溃 let markdownText: AttributedString do { markdownText = try AttributedString(markdown: processedText) } catch { markdownText = AttributedString(text) } Text(markdownText) } }
方案二:开启Markdown解析的硬换行选项
从iOS 15+/macOS 12+开始,AttributedString的Markdown解析支持配置选项,可直接开启单个\n作为硬换行的解析规则,无需修改原文本:
struct DetailTabView: View { var text: String var body: some View { var parsingOptions = AttributedString.MarkdownParsingOptions() // 开启硬换行解析,单个\n会被识别为换行 parsingOptions.interpretedSyntax.insert(.hardBreaks) let markdownText: AttributedString do { markdownText = try AttributedString(markdown: text, options: parsingOptions) } catch { markdownText = AttributedString(text) } Text(markdownText) } }
注意事项
- 禁止使用
try!强制解析,若文本包含无效Markdown语法会导致应用崩溃,建议用do-catch捕获错误并做兜底处理。 - 方案二需要iOS 15+/macOS 12+及以上系统支持,若需兼容更低版本,优先选择方案一。
内容的提问来源于stack exchange,提问作者Hyoryusha
相关产品推荐
相关产品推荐

