通常添加两个文本视图将产生一个文本视图,保留每个单独的文本视图的属性。例如:
Text(“Hello ”) + Text(“world!”).foregroundColor(.blue)
这段代码应该会产生
Hello world!
,其中world!
是蓝色的。现在,如果我想让world!
可点击并像按钮一样工作,我该怎么做呢?逻辑上讲,应该这样做:Text(“Hello ”) + Button(action: {}) { Text(“world!”).foregroundColor(.blue) }
然而,上面的代码不能直接编译。是否可以像描述的那样创建具有可点击部分的文本视图?我的使用情况是针对带有
@提到或#主题标记的推文,在其中您将点击提到或主题标记以显示详细视图。
编辑:之所以在HStack中使用Text view和Button不合适,是因为这在返回推文内容的Text view的函数中。
func styledText(text: String) -> Text {
var output = Text("")
let components = text.tokenize("@#. ")
for component in components {
if component.rangeOfCharacter(from: CharacterSet(charactersIn: "@#")) != nil {
output = output + Text(component).foregroundColor(.accentColor)
} else {
output = output + Text(component)
}
}
return output
}
String.tokenize
是一个如下所示的函数:
extension String {
func tokenize(_ delimiters: String) -> [String] {
var output = [String]()
var buffer = ""
for char in self {
if delimiters.contains(char) {
output.append(buffer)
buffer = String(char)
} else {
buffer += String(char)
}
}
output.append(buffer)
return output
}
}
编辑2:如果有帮助的话,我正在尝试创建一个SwiftUI版本:https://github.com/optonaut/ActiveLabel.swift。