【发布时间】:2019-11-16 20:11:11
【问题描述】:
通常,添加两个文本视图将生成一个文本视图,保留每个文本视图的属性。例如:
Text(“Hello ”) + Text(“world!”).foregroundColor(.blue)
这应该产生Hello world!,蓝色的world!。现在,如果我想让world! 可点击并充当按钮,我该怎么办?好吧,从逻辑上讲,这样做是有意义的:
Text(“Hello ”) + Button(action: {}) { Text(“world!”).foregroundColor(.blue) }
但是,直接上面的代码无法编译。是否可以按照所述创建带有可点击部分的文本视图?我的用例是用于带有 @ 提及或 # 主题标签的推文,您可以在其中点击提及或主题标签以显示详细视图。
编辑:在 HStack 中使用 Text 视图和 Button 不合适的原因是因为这是在返回推文内容的 Text 视图的函数中:
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。
【问题讨论】: