【问题标题】:SwiftUI TapGesture Not Working with NavigationLink in List on iOSSwiftUI TapGesture 不适用于 iOS 列表中的 NavigationLink
【发布时间】:2021-03-02 02:25:59
【问题描述】:

当我在 iOS 版 SwiftUI 中的 NavigationLink 上使用 .simultaneousGesture(TapGesture().onEnded{ //code to run }) 时,代码运行良好并且链接打开。

但是,如果NavigationLink 位于List 中,则代码会运行但链接不会打开。

还有其他方法可以运行一些代码之后 List NavigationLink 被点击,但之前 TextEditor 出现?

TextEditor 上使用.onAppear 是不合适的,因为我需要在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()
    }
}

谢谢!

【问题讨论】:

    标签: ios swift swiftui swiftui-list swiftui-navigationlink


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2022-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-15
      • 2023-04-04
      相关资源
      最近更新 更多