Comportement étrange de NavigationLink sur iPad

Sep 08 2020

Dans mon application, j'ai un Scrollview contenant des NavigationLinks incorporés dans un NavigationView. Sur l'iPad, appuyer sur NavigationLinks provoque quelque chose de bizarre. La première fois que l'un des éléments est pressé, cela fonctionne parfaitement bien et affiche la vue détaillée. Toute pression ultérieure sur d'autres éléments ne fait rien ou affiche la vue détaillée d'un élément précédemment appuyé. Parfois, cela fonctionnera pour quelques éléments d'affilée, mais se fige à nouveau.

Cela semble être un problème avec la pile de navigation?

Cet exemple simplifié montre l'erreur sur un iPad pro de 11 pouces exécutant iOS 13.7

struct ContentView: View {
    var body: some View {
        NavigationView {
            ScrollView {
                ForEach(0..<20) { index in
                    NavigationLink(destination: Text("\(index)")) {
                        Text("\(index)")
                            .padding()
                            .frame(width: 100, height: 100)
                            .background(Color.green)
                    }
                }
            }
        }
    }
}

Réponses

Asperi Sep 08 2020 at 23:00

Oui, cela ressemble à un bug. Vous pouvez envoyer des commentaires à Apple.

En attendant, voici une solution de contournement possible. Testé avec Xcode 11.7 / iOS 13.7

struct ContentView: View {
    @State private var selection = -1
    @State private var isActive = false

    var body: some View {
        NavigationView {
            ScrollView {
                ForEach(0..<20) { index in
                    Button(action: {
                        self.selection = index
                        self.isActive = true
                    } ) {
                        Text("\(index)")
                            .padding()
                            .frame(width: 100, height: 100)
                            .background(Color.green)
                    }
                }
            }
            .background(NavigationLink(destination: Text("\(selection)"),
                isActive: $isActive) { EmptyView() })
        }
    }
}