NavigationLink funciona solo por una vez

75

Estaba trabajando en una aplicación con inicio de sesión y después de iniciar sesión hay una lista de categorías. Y debajo de cada categoría hay algunos elementos enumerados horizontalmente. El problema es que después de iniciar sesión, aparece la página principal y todo aparece excelente. Cuando haces clic en un elemento, se dirige a la pantalla detallada, pero cuando intentas retroceder, simplemente se bloquea. Encontré este flujo ¿Por qué mi aplicación SwiftUI se bloquea al navegar hacia atrás después de colocar un `NavigationLink` dentro de un` navigationBarItems` en un `NavigationView`? Pero no pude resolver mi problema. Como mi proyecto se volvió complicado, solo quería practicar la navegación en swiftui y creé un nuevo proyecto. Por cierto, descargué la última versión de xcode 11.3. Escribí un código simple de la siguiente manera:

NavigationView{
        NavigationLink(destination: Test()) {
            Text("Show Detail View")
        }
    .navigationBarTitle("title1")

Y la vista Test () es la siguiente:

import SwiftUI

struct Test: View {
    var body: some View {
        Text("Hello, World!")
    }
}

struct Test_Previews: PreviewProvider {
    static var previews: some View {
        Test()
    }
}

Como puede ver, es realmente simple. También probé ejemplos similares en Internet, pero no funciona como se supone que funciona. Cuando ejecuto el proyecto, hago clic en el enlace de navegación y navega a la vista Prueba (). Luego hago clic en el botón Atrás y navega a la página principal. Sin embargo, cuando hago clic en el enlace de navegación por segunda vez, no sucede nada. El enlace de navegación funciona solo una vez y después de eso no pasa nada. No navega, no arroja ningún error. Soy nuevo en Swiftui y todo es genial, excepto la navegación. Probé muchos ejemplos y sugerí soluciones en Internet, pero nada parece solucionar mis problemas.

C.Aglar
fuente
2
versión de xCode 11.2 (11B52), este código funciona como se esperaba tanto en el lienzo como en el dispositivo
Александр Грабовский
3
Probó su instantánea de código con Xcode 11.2 / iOS 13.2: funciona bien. Intenta degradar Xcode.
Asperi
1
Xcode versión 11.2.1 (11B500) su código funciona como debe.
Nalov
2
Envié una reseña a Apple, queda esperar una futura actualización
Александр Грабовский
1
Informe de error enviado FB7518930
Pacu

Respuestas:

56

[ACTUALIZACIÓN] 12 de febrero de 2020: verifiqué este problema en Xcode 11.4 beta y descubrí que este problema se ha resuelto.


También estaba teniendo el mismo problema en mi proyecto, cuando lo estaba probando en el simulador de Xcode. Sin embargo, cuando lancé la aplicación en un dispositivo real (iPhone X con iOS 13.3), NavigationLinkfuncionaba totalmente bien. Entonces, realmente parece el error de Xcode.

Sagun Raj Lage
fuente
10
exactamente lo mismo para mi. Estoy empezando a lamentar haber elegido a Swiftui para una nueva aplicación
theMouk,
66
Acabo de pasar 4 horas sintiéndome muy estúpido ... Esto no está listo para la producción ...
Sebastian
SwiftUI sigue siendo básicamente la versión 1.0 ¿Alguna vez piensa usar v 1.0 de algo para un lanzamiento de producción? Comienzas con la expectativa de que mejorará. Esto no ayuda si necesita liberar antes de que eso suceda.
David Reich
@DavidReich si SwiftUI estaba en beta, podría entender que habría muchos problemas. En herramientas listas para producción, lo menos que uno debe esperar es que funcione. Ha habido varias "actualizaciones puntuales" de iOS y macOS desde el lanzamiento inicial el año pasado, por lo que los errores evidentes como este o el "error del título de la lista de saltos" deberían haberse eliminado hace mucho tiempo. Traté de usarlo para una aplicación de producción, pero tuve que volver a UIKit para obtener un resultado decente.
GJ Nilsen
3
[ACTUALIZACIÓN] 12 de febrero de 2020: verifiqué este problema en Xcode 11.4 beta y descubrí que este problema se ha resuelto.
Sagun Raj Lage
5

Simulador 11.4: este problema se ha solucionado

Debe restablecer el isActivevalor predeterminado en la segunda vista. Funciona en dispositivos y emuladores.

struct NavigationViewDemo: View {
    @State var isActive = false

    var body: some View {
        NavigationView {
            VStack {
                Text("View1")
                NavigationLink(
                    destination: NavigationViewDemo_View2(isActive: $isActive),
                    isActive: $isActive,
                    label: { Button(action: { self.isActive = true }, label: { Text("click") }) })
            }
        }
    }
}

struct NavigationViewDemo_View2: View {
    @Binding var isActive: Bool

    var body: some View {
        Text("View2")
            .navigationBarItems(leading: Button(action: { self.isActive = false }, label: { Text("Back") }))
    }
}
Victor Kushnerov
fuente
Tengo problemas con el simulador y mi dispositivo físico para hacer que NavigationLink funcione más de una vez. Nada lo arregla en el simulador, pero un método similar a este que funciona para mi dispositivo físico es configurar onDisappear en View2 que restablece el indicador activo. Es una solución marginalmente más limpia para un error de Xcode (porque no tiene que vincularse a un estado que View2 no debería conocer). NavigationViewDemo_View2 (). OnDisappear (realizar: {self.isActive = false})
SJoshi
@SJoshi Lo tengo pero onDisappear se llamará después isActivees falso para que NavigationView no funcione correctamente. Es una solución temporal para emuladores solo porque NavigationView funciona correctamente en dispositivos. En versiones anteriores de emuladores, NavigationView funcionó, espero que se solucione en un emulador futuro.
Victor Kushnerov
Curiosamente, este código no funciona en mi simulador O dispositivo físico: la solución que propuse restablece el indicador activo cuando se descarta la vista detallada, y permite que el dispositivo físico funcione. Se dice en la calle que Xcode 13.4 soluciona este problema
SJoshi
Probé en el simulador 11.3.1 que funciona a las mil maravillas. Ves 3 comienzos, supongo que otros también ayudaron.
Victor Kushnerov
Sí, yo también probé eso, usando múltiples iPhones. Además, probado en 4 dispositivos físicos, sin suerte. Este error es definitivamente ridículo. Mientras tanto, terminé haciendo una solución ridícula para el simulador.
SJoshi
1

Como @ Александр Грабовский dijo que parece un error de Xcode 11.3, me encuentro con el mismo problema, debe degradar o usar una solución alternativa como el botón de retroceso personalizado como se muestra a continuación

struct ContentView: View {
    @State private var pushed: Bool = false

    var body: some View {

        NavigationView {
            VStack {
                Button("Show Detail View") {
                    self.pushed.toggle()
                }

                NavigationLink(destination: Test(pushed: $pushed), isActive: $pushed) { EmptyView() }
            }.navigationBarTitle("title1")
        }
    }
}
struct Test: View {
    @Binding var pushed: Bool
    var body: some View {
        Text("Hello, World!")
            .navigationBarBackButtonHidden(true)
            .navigationBarItems(leading: BackButton(label: "Back") {
                self.pushed = false
            })
    }
}
struct BackButton: View {
    let label: String
    let closure: () -> ()

    var body: some View {
        Button(action: { self.closure() }) {
            HStack {
                Image(systemName: "chevron.left")
                Text(label)
            }
        }
    }
}
ozmpai
fuente