Strano comportamento di NavigationLink su iPad

Sep 08 2020

Nella mia app, ho una Scrollview contenente NavigationLink incorporati in una NavigationView. Sull'iPad, premendo i NavigationLinks accade qualcosa di strano. La prima volta che uno degli elementi viene premuto, funziona perfettamente e mostra la visualizzazione dei dettagli. Qualsiasi pressione successiva su altri elementi non fa nulla o mostra la vista dettagliata di un elemento premuto in precedenza. A volte funziona per alcuni elementi di seguito, ma poi si blocca di nuovo.

Sembra un problema con lo stack di navigazione?

Questo esempio semplificato mostra l'errore su un iPad pro da 11 "con 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)
                    }
                }
            }
        }
    }
}

Risposte

Asperi Sep 08 2020 at 23:00

Sì, sembra un insetto. Puoi inviare feedback ad Apple.

Nel frattempo, ecco una possibile soluzione alternativa. Testato con 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() })
        }
    }
}