如何在 SwiftUI 文本视图中向特定单词添加 onTapGesture 和下划线?

Jak*_*ith 4 ios swiftui

我需要在 SwiftUI 视图的文本段落中使特定的带下划线的单词可点击。

目前我的 onTapGesture 适用于整个段落,但我只需要在Text(labelOne)(AKA Action)上使用它。

我无法在 Text(labelOne) 上使用 onTapGesture AND .underline,因为如果 underline() 放置在 onTapGesture {} 下,则会出现错误“无法将‘some View’类型的值转换为预期参数类型‘Text’”或“无法转换值”如果我将 onTapGesture{} 放在 .underline() 下,则“某些视图”类型将变为预期参数类型“文本”” 。

在这种情况下,我组合了文本视图,Text(“Action”)+ Text(“第一句结束。”)+ Text(“Body Text”),所以这就是阻止我将 .onTapGesture 与 .underline() 组合的原因

最好在段落内使用按钮,以便用户获得按下操作的视觉反馈,但不确定在不与文本分离的情况下这是否可能?

在此输入图像描述

如果将 Text 放入 HStack 中(这将允许我将 .underline() 和 .onTapGesture{} 添加到特定视图),如果 Text(labelTwo) 的句子增长,则看起来很糟糕,请参见下文

在此输入图像描述

struct TextView: View {
    let labelOne: String = "Action"
    let labelTwo: String = "end of first sentence."
    let text: String = "Begining of second sentence lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem"
    
    var body: some View {
        HStack {
            Text(labelOne) // <- Needs to be tappable, solely.
                .underline()
            + Text(" \(labelTwo) ")
            + Text(text)
        }
        .onTapGesture { // <- Applies to whole paragraph (BAD)
            print("Action pressed")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Ash*_*lls 5

您可以通过三个步骤解决这个问题:

首先,为您的应用程序定义一个自定义 URL 方案,例如

    <key>CFBundleURLTypes</key>
    <array>
        <dict>
            <key>CFBundleTypeRole</key>
            <string>Editor</string>
            <key>CFBundleURLName</key>
            <string>com.example.myapp</string>
            <key>CFBundleURLSchemes</key>
            <array>
                <string>myappurl</string>
            </array>
        </dict>
    </array>

Run Code Online (Sandbox Code Playgroud)

这可以在目标的“信息”选项卡中完成: 在此输入图像描述

其次,更改您的第一个文本以使用 Markdown,用作Action链接文本和使用新定义的 URL 方案的 url,例如

Text("[\(labelOne)](myappurl://action)").underline()
Run Code Online (Sandbox Code Playgroud)

最后添加.onOpenURL修饰符。当您点击链接时,应用程序将尝试自行打开,并且可以通过此修饰符来处理。

HStack {
    Text("[\(labelOne)](myappurl://action)").underline() +
    Text(" \(labelTwo) ") +
    Text(text)
}.onOpenURL { link in

    // do whatever action you want on tapping the link


}
Run Code Online (Sandbox Code Playgroud)