是否可以在 SwiftUI 中将 Button<Text> 添加到 Text 中?

Jac*_*Dev 8 swift swiftui

通常,添加两个文本视图将生成一个保留每个单独文本视图属性的文本视图。例如:

\n\n
Text(\xe2\x80\x9cHello \xe2\x80\x9d) + Text(\xe2\x80\x9cworld!\xe2\x80\x9d).foregroundColor(.blue)\n
Run Code Online (Sandbox Code Playgroud)\n\n

这应该会产生Hello world!, 为world!蓝色。world!现在,如果我想要可点击并充当按钮,我该怎么办?好吧,从逻辑上讲,这样做是有意义的:

\n\n
Text(\xe2\x80\x9cHello \xe2\x80\x9d) + Button(action: {}) { Text(\xe2\x80\x9cworld!\xe2\x80\x9d).foregroundColor(.blue) }\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,上面的代码无法编译。是否可以按照描述创建具有可点击部分的文本视图?我的使用 cas 用于带有@提及或#\xc2\xa0hashtags 的推文,您可以点击提及或主题标签以显示详细视图。

\n\n

编辑:在 HStack 中使用文本视图和按钮不合适的原因是因为这是在一个为推文内容返回文本视图的函数内:

\n\n
func styledText(text: String) -> Text {\n    var output = Text("")\n    let components = text.tokenize("@#. ")\n    for component in components {\n        if component.rangeOfCharacter(from: CharacterSet(charactersIn: "@#")) != nil {\n            output = output + Text(component).foregroundColor(.accentColor)\n        } else {\n            output = output + Text(component)\n        }\n    }\n    return output\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

以下内容在哪里String.tokenize

\n\n
func styledText(text: String) -> Text {\n    var output = Text("")\n    let components = text.tokenize("@#. ")\n    for component in components {\n        if component.rangeOfCharacter(from: CharacterSet(charactersIn: "@#")) != nil {\n            output = output + Text(component).foregroundColor(.accentColor)\n        } else {\n            output = output + Text(component)\n        }\n    }\n    return output\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

编辑2:如果有帮助,我正在尝试创建一个 SwiftUI 版本:https://github.com/optonaut/ActiveLabel.swift

\n

Chr*_*ris 3

我不确定你是否想要这个或者你想要明确使用 + 但你可以通过这个达到你的目标

 HStack {
                Text("Hello ")
                Button(action: {
                    // do something
                    print("tapped")
                }, label: {
                    Text("world!").foregroundColor(.blue)
                })
            }
Run Code Online (Sandbox Code Playgroud)