Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以添加按钮<;文本>;在SwiftUI中发送文本?_Swift_Swiftui - Fatal编程技术网

是否可以添加按钮<;文本>;在SwiftUI中发送文本?

是否可以添加按钮<;文本>;在SwiftUI中发送文本?,swift,swiftui,Swift,Swiftui,通常,添加两个文本视图将生成一个保留每个单独文本视图属性的文本视图。例如: Text(“Hello”)+Text(“world!”).foregroundColor(.blue) 这将产生helloworld,与世界蓝色。现在,如果我想要世界,我该怎么办可点击并充当按钮?从逻辑上讲,这样做是有意义的: Text(“Hello”)+按钮(操作:{}{Text(“world!”).foregroundColor(.blue)} 但是,上面的代码并不编译。是否可以创建具有所述可点击部分的文本视图?

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

Text(“Hello”)+Text(“world!”).foregroundColor(.blue)
这将产生
helloworld,与
世界蓝色。现在,如果我想要
世界,我该怎么办可点击并充当按钮?从逻辑上讲,这样做是有意义的:

Text(“Hello”)+按钮(操作:{}{Text(“world!”).foregroundColor(.blue)}
但是,上面的代码并不编译。是否可以创建具有所述可点击部分的文本视图?我的cas用于带有
@
提及或
#
标签的推文,您可以点击提及或标签以显示详细视图

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

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
如下所示:

扩展字符串{
func标记化(u分隔符:字符串)->[String]{
变量输出=[String]()
var buffer=“”
在自我中寻找char{
if delimiters.contains(字符){
output.append(缓冲区)
缓冲区=字符串(字符)
}否则{
缓冲区+=字符串(字符)
}
}
output.append(缓冲区)
返回输出
}
}

编辑2:如果有帮助,我正在尝试创建此版本的快速用户界面:。

我不确定您是想要此版本还是想要明确使用+,但您可以通过此版本实现目标

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

您不能在此处使用
+
,因为
.foregroundColor
修改器生成
一些视图
,但不生成
文本

相反,您可以使用几乎相同的:

var body: some View {
    HStack {
        Text("Hello")
        Text("world!").foregroundColor(.blue).onTapGesture {
            print("world got tapped")
        }
    }
}

您可以扩展AnyView以获得所需的内容。如果你非常擅长编程,你可以为你的目标引入更复杂的自动布局

extension AnyView{
    static func + (left: AnyView, right: AnyView) -> AnyView{
        return AnyView(HStack{left.fixedSize(horizontal: true, vertical: false)
                              right.fixedSize(horizontal: true, vertical: false)})
    }
}


func styledText(text: String) -> AnyView {
    var output = AnyView(Text(""))
    let components = text.tokenize("@#. ")
    for component in components {
        if component.rangeOfCharacter(from: CharacterSet(charactersIn: "@#")) != nil {
            output = output + AnyView(Text(component).foregroundColor(.accentColor).onTapGesture {
                print(component)
            })
        } else {
            output = output + AnyView(Text(component))
        }
    }

    return output
}

感谢您的回复-这不合适,因为
@
提及或
#
标签按钮将位于正文中,高度超过一行,并且可能位于所述文本中的任何位置。感谢您的回复-这不合适,因为
@
提及或
#
标签按钮将位于文本正文中,高度超过一行,并且可以位于所述文本中的任何位置。
文本
有自己的
foregroundColor()
方法生成
文本
func foregroundColor(Color?)->text
。是
ontapsignate
按钮
生成了
视图
。谢谢!如果将
AnyView
扩展名中的
HStack
的间距设置为
0
,几乎可以产生所需的结果!唯一的问题是,
HStack
没有包装它的内容,因此整个文本段落将结束在一行上,扰乱了视图。有没有办法克服这个问题或者让它发生呢?所以你需要fixSize来测试不同的配置