iOS 上的列表中的 SwiftUI TapGesture 无法使用 NavigationLink

SwiftUI TapGesture Not Working with NavigationLink in List on iOS

当我在 SwiftUI 的 NavigationLink 上为 iOS 使用 .simultaneousGesture(TapGesture().onEnded{ //code to run }) 时,代码 运行 正常并且 link 打开。

但是,如果 NavigationLinkList 中,代码 运行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()
    }
}