ios - SwiftUI TapGesture 不适用于 iOS 列表中的 NavigationLink
问题描述
当我在 SwiftUI for iOS 中使用.simultaneousGesture(TapGesture().onEnded{ //code to run })
时NavigationLink
,代码运行良好并且链接打开。
但是,如果NavigationLink
位于 a 中List
,则代码会运行,但链接不会打开。
有没有另一种方法可以在点击之后List
NavigationLink
但在出现之前运行一些代码TextEditor
?
.onAppear
在, 上使用TextEditor
不合适,因为我需要在 TextEditor 出现之前运行代码 - 部分原因是TextEditor
' 重新渲染的错误,部分原因是为了让事情以正确的顺序流动。
复制问题的代码:
import SwiftUI
struct ContentView: View {
@State private var textString = ""
@State private var listMembers = ["Link A", "Link B", "Link C"]
var body: some View {
NavigationView {
VStack {
List(listMembers, id: \.self) { member in
NavigationLink(member, destination: TextEditor(text: $textString))
.simultaneousGesture(TapGesture().onEnded {
textString = "Link A, B, or C was tapped."
print(textString)
})
}
NavigationLink("Link D", destination: TextEditor(text: $textString))
.simultaneousGesture(TapGesture().onEnded {
textString = "Link D was tapped."
})
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
谢谢你!
解决方案
我能想到的最好的方法是使用 ForEach 而不是 List。它需要更多格式才能使其看起来不错,但似乎可以解决问题。
import SwiftUI
struct ContentView: View {
@State private var textString = ""
@State private var listMembers = ["Link A", "Link B", "Link C"]
var body: some View {
NavigationView {
VStack {
/*List(listMembers, id: \.self) { member in
NavigationLink(member, destination: TextEditor(text: $textString))
.simultaneousGesture(TapGesture().onEnded {
textString = "Link A, B, or C was tapped."
print(textString)
})
}*/
ForEach(listMembers, id: \.self) { member in
NavigationLink(member, destination: TextEditor(text: $textString))
.simultaneousGesture(TapGesture().onEnded {
textString = "Link A, B, or C was tapped."
print(textString)
})
}
NavigationLink("Link D", destination: TextEditor(text: $textString))
.simultaneousGesture(TapGesture().onEnded {
textString = "Link D was tapped."
})
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}