iOS 上的列表中的 SwiftUI TapGesture 无法使用 NavigationLink
SwiftUI TapGesture Not Working with NavigationLink in List on iOS
当我在 SwiftUI 的 NavigationLink
上为 iOS 使用 .simultaneousGesture(TapGesture().onEnded{ //code to run })
时,代码 运行 正常并且 link 打开。
但是,如果 NavigationLink
在 List
中,代码 运行s 但 link 不会打开。
有没有另一种方法我可以运行一些代码在 List
NavigationLink
被点击,但之前出现TextEditor
?
在 TextEditor
上使用 .onAppear
是不合适的,因为在 TextEditor 出现之前我需要 运行 的代码 - 部分原因是 TextEditor
' 的错误s 重新渲染,部分是为了保持事物以正确的顺序流动。
复制问题的代码:
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()
}
}
当我在 SwiftUI 的 NavigationLink
上为 iOS 使用 .simultaneousGesture(TapGesture().onEnded{ //code to run })
时,代码 运行 正常并且 link 打开。
但是,如果 NavigationLink
在 List
中,代码 运行s 但 link 不会打开。
有没有另一种方法我可以运行一些代码在 List
NavigationLink
被点击,但之前出现TextEditor
?
在 TextEditor
上使用 .onAppear
是不合适的,因为在 TextEditor 出现之前我需要 运行 的代码 - 部分原因是 TextEditor
' 的错误s 重新渲染,部分是为了保持事物以正确的顺序流动。
复制问题的代码:
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()
}
}