Comportamiento extraño de NavigationLink en iPad

Sep 08 2020

En mi aplicación, tengo un Scrollview que contiene NavigationLinks incrustado en un NavigationView. En el iPad, presionar NavigationLinks hace que suceda algo extraño. La primera vez que se presiona uno de los elementos, funciona perfectamente bien y muestra la vista detallada. Cualquier pulsación posterior sobre otros elementos no hace nada o muestra la vista detallada de un elemento previamente pulsado. A veces, funcionará para algunos elementos seguidos, pero luego se congela nuevamente.

¿Parece un problema con la pila de navegación?

Este ejemplo simplificado muestra el error en un iPad pro de 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)
                    }
                }
            }
        }
    }
}

Respuestas

Asperi Sep 08 2020 at 23:00

Sí, parece un error. Puede enviar comentarios a Apple.

Mientras tanto, aquí hay una posible solución. Probado 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() })
        }
    }
}