SwiftUI中@Published属性字符串传递至View后无法保留格式如何解决?
解决SwiftUI中ViewModel传递Markdown格式字符串失效的问题
问题原因
直接在Text中传入字面量字符串时,SwiftUI会自动识别并解析Markdown格式(比如**表示粗体),但从ViewModel传递字符串变量时,默认只会当作普通文本处理,不会解析格式。你之前尝试AttributedString没生效,大概率是因为没通过Markdown语法正确初始化该类型。
两种可行解决方案
方案一:在ViewModel中直接定义AttributedString类型的@Published属性
在ViewModel里通过Markdown语法初始化AttributedString,传递到View时已带好格式:
final class ViewModel: ObservableObject { @Published var attributedString: AttributedString = { guard let attrString = try? AttributedString(markdown: "**This** should be bold") else { return AttributedString("This should be bold") } return attrString }() } struct ContentView: View { @ObservedObject private var viewModel = ViewModel() var body: some View { Text(viewModel.attributedString) } }
方案二:在View中将String转换为Markdown格式的AttributedString
如果需要保持ViewModel属性为String类型,可在View中做转换:
final class ViewModel: ObservableObject { @Published var text = "**This** should be bold" } struct ContentView: View { @ObservedObject private var viewModel = ViewModel() var body: some View { if let attrString = try? AttributedString(markdown: viewModel.text) { Text(attrString) } else { Text(viewModel.text) } } }
补充说明
AttributedString(markdown:)会抛出错误(比如Markdown语法不合法),建议用try?或do-catch处理异常,避免崩溃。- 这种方式支持所有标准Markdown语法,包括斜体
*、链接[text](url)等。
内容的提问来源于stack exchange,提问作者moosgrn
相关产品推荐
相关产品推荐

