首页 > 解决方案 > 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()
    }
}

谢谢你!

标签: iosswiftswiftuiswiftui-listswiftui-navigationlink

解决方案


我能想到的最好的方法是使用 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()
    }
}

推荐阅读