SwiftUI TapGesture Не работает с NavigationLink в списке на iOS

#ios #swift #swiftui #swiftui-list #swiftui-navigationlink

#iOS #быстрый #свифтуи #список swiftui #swiftui-navigationlink

Вопрос:

Когда я использую .simultaneousGesture(TapGesture().onEnded{ //code to run }) on a NavigationLink в SwiftUI для iOS, код выполняется нормально, и ссылка открывается.

Однако, если значение 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()
    }
}
 

Спасибо!

Ответ №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()
    }
}