Comportamento estranho do NavigationLink no iPad

Sep 08 2020

Em meu aplicativo, tenho um Scrollview contendo NavigationLinks incorporado em um NavigationView. No iPad, pressionar NavigationLinks faz com que algo estranho aconteça. A primeira vez que um dos itens é pressionado, funciona perfeitamente bem e mostra a visualização de detalhes. Qualquer pressionamento subsequente em outros itens não faz nada ou mostra a exibição de detalhes de um item pressionado anteriormente. Às vezes funciona para alguns itens seguidos, mas congela novamente.

Parece um problema com a pilha de navegação?

Este exemplo simplificado mostra o erro em um iPad pro de 11 "executando 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)
                    }
                }
            }
        }
    }
}

Respostas

Asperi Sep 08 2020 at 23:00

Sim, parece um bug. Você pode enviar comentários para a Apple.

Enquanto isso, aqui está uma solução possível. Testado com 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() })
        }
    }
}