我需要在 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)
您可以通过三个步骤解决这个问题:
首先,为您的应用程序定义一个自定义 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)