es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Problema de NavigationLink de SwiftUI con múltiples selecciones.

Tengo un problema con la navegación de SwiftUI. Para mostrar el problema, he creado un ejemplo simple de una lista de coches y si el usuario hace clic en él, muestra los detalles del coche:

struct ContentView: View {
    var cars = [Car(name: "A"), Car(name: "B"), Car(name: "C"), Car(name: "D")]

    var body: some View {
        NavigationView {
            LazyVStack(spacing: 10) {
               ForEach(cars, id: \.self) { car in
                   NavigationLink(destination: {
                       CarDetailsView(viewModel: CarDetailsViewModel(car: car))
                   },
                   label: {
                       CarRowView(car: car)
                   })
               }
           }
        }
    }
}

struct CarDetailsView: View {
    @StateObject var viewModel: CarDetailsViewModel
    @Environment(\.presentationMode) private var presentationMode

    var body: some View {
        Button("Atrás") {
            presentationMode.wrappedValue.dismiss()
        }
    }
}

class CarDetailsViewModel: ObservableObject {
    @Published var car: Car

    init(car: Car) {
        self.car = car
    }
}

struct Car: Hashable {
    var name: String
}

struct CarRowView: View {
    var car: Car

    var body: some View {
        Text(car.name)
    }
}

Esto funciona bien cuando se selecciona un coche a la vez. Desafortunadamente, con SwiftUI no puedo desactivar la selección múltiple. Si el usuario selecciona varios coches al mismo tiempo, y luego vuelve a la lista de coches, a veces obtengo un registro de error:

SwiftUI encontró un problema al empujar un NavigationLink. Por favor, informe un error.

En ese momento, la lista de coches ya no responde. Se requieren unos cuantos intentos, pero eventualmente sucede. Solo he podido replicar esto en iOS 15 hasta ahora. También intenté hacerlo sin el viewModel y todavía ocurre. Idealmente, quiero mantener el NavigationLink dentro del VStack porque hace que la fila se oscurezca cuando el usuario la selecciona.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema parece estar relacionado con la selección múltiple habilitada por defecto en SwiftUI. Para solucionar este problema, puede desactivar la selección múltiple estableciendo el límite de selección en 1 en el ciclo ForEach de esta manera:

    ForEach(cars, id: \.self) { car in
        NavigationLink(destination: {
            CarDetailsView(viewModel: CarDetailsViewModel(car: car))
        },
        label: {
            CarRowView(car: car)
        })
        .selectionLimit(1) // desactivar selección múltiple
    }
    

    Esto debería evitar que el usuario seleccione varios autos al mismo tiempo y evitar el registro de errores al volver a la lista de autos. Además, puede mantener el NavigationLink dentro del VStack ya que proporciona el efecto de atenuación de fila.

Comments are closed.