Ios SwiftUI:在同一行上组合文本
我正在编写的SwiftUI应用程序有大量的文本块,因此我正在尝试创建一种“标记语言”,我可以在保存文本的JSON文件中使用它来定义单词何时应该加粗。问题是,我似乎无法阻止新文本块转到另一行 以下是我目前拥有的相关代码Ios SwiftUI:在同一行上组合文本,ios,iphone,xcode,swiftui,Ios,Iphone,Xcode,Swiftui,我正在编写的SwiftUI应用程序有大量的文本块,因此我正在尝试创建一种“标记语言”,我可以在保存文本的JSON文件中使用它来定义单词何时应该加粗。问题是,我似乎无法阻止新文本块转到另一行 以下是我目前拥有的相关代码 struct formattedText: View { var text: String var body: some View { let split = text.components(separatedBy: "**") Group {
struct formattedText: View {
var text: String
var body: some View {
let split = text.components(separatedBy: "**")
Group {
ForEach(split, id: \.self) { line in
if line.hasPrefix("$$") {
Text(line.trimmingCharacters(in: CharacterSet(charactersIn: "$")))
.bold()
} else {
Text(line)
}
}
}
.lineLimit(nil)
.multilineTextAlignment(.leading)
}
使用此代码,我可以将***$
放在单词前面,将***
放在后面,将其定义为粗体
唯一的问题是每次我加粗一个词,它就会转到一个新行。我知道解决这个问题的传统方法是:
Text("Simple ") + Text("Swift ") + Text("Guide")
但这不适用于我的ForEach循环。有什么建议吗?
ForEach
创建单独的视图。您实际上只需要一个文本,因此您指的是循环中…的:
var body: some View {
let split = text.components(separatedBy: "**")
var result = Text("")
for line in split {
if line.hasPrefix("$$") {
result = result + Text(line.trimmingCharacters(in: CharacterSet(charactersIn: "$")))
.bold()
} else {
result = result + Text(line)
}
}
return result
.lineLimit(nil)
.multilineTextAlignment(.leading)
}
由于您可能需要的不仅仅是粗体,您可能会发现将该部分提取到自己的函数或函数集合中非常有用:
private func applyAttributes(line: String) -> Text {
if line.hasPrefix("$$") {
return Text(line.trimmingCharacters(in: CharacterSet(charactersIn: "$")))
.bold()
} else {
return Text(line)
}
}
因此,构建此模型更为简单:
var body: some View {
text.components(separatedBy: "**")
.map(applyAttributes)
.reduce(Text(""), +)
.lineLimit(nil)
.multilineTextAlignment(.leading)
}
ForEach
创建单独的视图。您实际上只需要一个文本,因此您指的是循环中…的:
var body: some View {
let split = text.components(separatedBy: "**")
var result = Text("")
for line in split {
if line.hasPrefix("$$") {
result = result + Text(line.trimmingCharacters(in: CharacterSet(charactersIn: "$")))
.bold()
} else {
result = result + Text(line)
}
}
return result
.lineLimit(nil)
.multilineTextAlignment(.leading)
}
由于您可能需要的不仅仅是粗体,您可能会发现将该部分提取到自己的函数或函数集合中非常有用:
private func applyAttributes(line: String) -> Text {
if line.hasPrefix("$$") {
return Text(line.trimmingCharacters(in: CharacterSet(charactersIn: "$")))
.bold()
} else {
return Text(line)
}
}
因此,构建此模型更为简单:
var body: some View {
text.components(separatedBy: "**")
.map(applyAttributes)
.reduce(Text(""), +)
.lineLimit(nil)
.multilineTextAlignment(.leading)
}
明亮的工作得很好。非常感谢。明亮的工作得很好。非常感谢。