Estoy diseñando una aplicación que incluye la función de recuperar datos JSON y mostrar una lista de elementos recuperados en una vista de tipo FileBrowser. En esta vista, un usuario debe poder hacer clic en una carpeta para profundizar en el árbol de archivos o hacer clic en un archivo para ver algunos metadatos sobre dicho archivo.
Observé que mientras esto funciona, cuando hago clic en un archivo o carpeta y luego vuelvo y hago clic en él nuevamente, el NavigationLink no se activa y estoy atascado en la vista hasta que hago clic en un NavigationLink diferente.
Aquí hay un gif que demuestra este problema.
Como se ve aquí, cuando hago clic en BlahBlah, estoy activando el NavigationLink y lo llevo a BlahBlah, luego, cuando navego hacia atrás y trato de volver a navegar a BlahBlah, se vuelve gris, registrando que hice clic en él ... pero nunca me transporta allí . Hacer clic en TestFile soluciona esto y me permite navegar de regreso a BlahBlah.
Los elementos de la lista están hechos con las siguientes estructuras
private struct FileCell{
    var FileName: String
    var FileType: String
    var FileID: String = ""
    var isContainer: Bool
}
private struct constructedCell: View{
    var FileType: String
    var FileName: String
    var FileID: String
    var body: some View {
        return
            HStack{
                VStack(alignment: .center){
                    Image(systemName: getImage(FileType: FileType)).font(.title).frame(width: 50)
                }
                Divider()
                VStack(alignment: .leading){
                    Text(FileName).font(.headline)
                        .multilineTextAlignment(.leading)
                    Text(FileID)
                        .font(.caption)
                        .multilineTextAlignment(.leading)
                }
        }
    }
}
y aparece a la vista con los enlaces de navegación de la siguiente manera
List(cellArray, id: \.FileID) { cell in
                if (cell.isContainer) {
                    NavigationLink(destination: FileView(path: "/\(cell.FileID)", displaysLogin: self.$displaysLogin).navigationBarTitle(cell.FileName)){
                        constructedCell(FileType: cell.FileType, FileName: cell.FileName, FileID: cell.FileID)
                    }
                } else {
                    NavigationLink(destination: DetailView(FileID: cell.FileID).navigationBarTitle(cell.FileName)){
                        constructedCell(FileType: cell.FileType, FileName: cell.FileName, FileID: cell.FileID)
                    }
                }
            }
Mi NavigationView se inicializa en la vista de arriba (la aplicación tiene una vista de pestañas) de la siguiente manera
TabView(selection: $selection){
               NavigationView{
                    FileView(displaysLogin: self.$displaysLogin)
                        .navigationBarTitle("Home", displayMode: .inline)
                        .background(NavigationConfigurator { nc in
                            nc.navigationBar.barTintColor = UIColor.white
                            nc.navigationBar.titleTextAttributes = [.foregroundColor : UIColor.black]
                        })
                }
                .font(.title)
                .tabItem {
                    VStack {
                        Image(systemName: "folder.fill")
                        Text("Files")
                    }
                }
                .tag(0)
}
NavigationConfigurator es una estructura que uso para manejar el color de la barra de navegación. Está configurado así
struct NavigationConfigurator: UIViewControllerRepresentable {
    var configure: (UINavigationController) -> Void = { _ in }
    func makeUIViewController(context: UIViewControllerRepresentableContext<NavigationConfigurator>) -> UIViewController {
        UIViewController()
    }
    func updateUIViewController(_ uiViewController: UIViewController, context: UIViewControllerRepresentableContext<NavigationConfigurator>) {
        if let nc = uiViewController.navigationController {
            self.configure(nc)
        }
    }
}
¿No creo que mi NavigationConfigurator esté causando esto? Este error también ocurre en otros enlaces de navegación en la aplicación, pero fue más fácil demostrarlo aquí en la vista FileBrowser.
Esto podría ser un error en SwiftUI? Si es así, ¿alguien sabe una forma de evitar esto? Si no es así, ¿qué estoy haciendo mal?
fuente


NavigationLinkdentro de unNavigationViewy quitarloNavigationViewdelFileView? He visto algunos ejemplos por aquí que lo hacen de esa manera.NavigationLinkinteriorFileViewestá envuelto en un,NavigationViewpor lo tanto,NavigationLinkestá envuelto dentro de unNavigationViewcellArray?Respuestas:
Tuve el mismo problema: prueba esto. Llamaría a esto un truco que se eliminará cuando se corrija el error en swiftUI.
Esencialmente parece que en algunas circunstancias (iOS 13.3 - ¿Simulador?) El NavigationLink no se restablece cuando la vista de destino se elimina de la pila de navegación. Como solución, necesitamos regenerar el enlace de navegación. Esto es lo que hace cambiar la identificación. Esto corrigió mi problema.
Sin embargo, si tiene NavigationLinks que están encadenados, es decir, un enlace que conduce a otra lista de enlaces, entonces esta solución creará efectos secundarios; la pila vuelve al origen en el segundo intento de mostrar la última vista.
fuente