Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

358
Vistas
Comportamiento extraño de la lista de SwiftUI al eliminar un elemento de la lista

He tenido un problema con mi lista donde, después de eliminar un elemento, se elimina correctamente, pero si alterno entre dos ramas en la misma vista, los elementos de mi lista obtienen este relleno inicial extraño.

No estoy seguro de cómo explicarlo exactamente, así que adjunto un ejemplo de lo que sucede.

https://imgur.com/CbzCSiQ

Aquí está el código de fila de mi lista:

 if (/** condition **/) { EmptyView() } else { ZStack(alignment: .center) { NavigationLink( destination: MovieDetailsView(movie: moviesVM.movie)) { EmptyView() }.opacity(0) WebImage(url: moviesVM.movie.backdropUrl) .resizable() .placeholder { Image("tile_placeholder") .resizable() .aspectRatio(aspectRatioW780Poster, contentMode: .fill) .frame(maxHeight: 170) .clipped() } .transition(.fade(duration: 0.5)) .aspectRatio(aspectRatioW780Poster, contentMode: .fill) .frame(maxHeight: 170) .clipped() .overlay(TextOverlay(movieOrShow: moviesVM.movie)) } .swipeActions(edge: .trailing, allowsFullSwipe: false) { // buttons that invoke removal } }

Y las filas de la lista se instancian dentro de la vista de "perfil", que se ve así:

 NavigationView { VStack { if profileVM.profileRepository.profile == nil { HStack(alignment: .center) { Text("Please log in or sign up to use your watchlist. ☺️") } } if profileVM.profileRepository.profile != nil { HStack { Text("Watched") Toggle("Watched", isOn: $profileVM.defaultTab) .onChange(of: profileVM.defaultTab, perform: { _ in profileVM.updateDefaultTab() }) .labelsHidden() .tint(Constants.MUSH_BLUE) Text("Watchlist") } // this is where my view "branches" depending on the toggle HStack { if !profileVM.defaultTab { ZStack(alignment: .center) { List { ForEach(Array(profileVM.profileRepository.watchedMovies), id: \.id) { movie in MovieListRow(moviesVM: MoviesViewModel(profileRepository: profileVM.profileRepository, movie: movie, fromProfile: true)) .id(movie.id) .listRowInsets(EdgeInsets()) .listRowSeparator(.hidden) } } .listStyle(InsetListStyle()) if profileVM.profileRepository.watchedMovies.count == 0 { Text("Nothing here yet :)") } } } else { ZStack(alignment: .center) { List { ForEach(Array(profileVM.profileRepository.watchlistedMovies), id: \.id) { movie in MovieListRow(moviesVM: MoviesViewModel(profileRepository: profileVM.profileRepository, movie: movie, fromProfile: true)) .id(movie.id) .listRowInsets(EdgeInsets()) .listRowSeparator(.hidden) } } .listStyle(InsetListStyle()) if profileVM.profileRepository.watchlistedMovies.count == 0 { Text("Nothing here yet :)") } } } } } } .navigationTitle("Watchlist") }

jerarquía de vistas de depuración

vista de depuración

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Aqui hay algunas ideas:

  1. moviesVM : no usamos objetos de modelo de vista en SwiftUI. Para los datos de vista transitorios, usamos View struct con @State y @Binding , lo que hace que el tipo de valor de estructura realmente se comporte como un objeto porque cuando la estructura se inicia nuevamente, automáticamente tiene los mismos valores de propiedad que la última vez que se inició. Usamos un objeto para administrar la vida útil de nuestras matrices o estructuras de datos modelo, en una propiedad @Published en un ObservableObject que pasamos a Views usando environmentObject .
  2. ForEach(Array( - La vista ForEach debe recibir los datos de su modelo para que funcione correctamente, que suele ser una matriz de estructuras que se ajustan a Identifiable . Por ejemplo ForEach($model.movies) $movie in escritura.
  3. MovieListRow(moviesVM MoviesViewModel( - es un error iniciar objetos en body de esa manera, eso ralentizará SwiftUI y causará fugas de memoria. En el cuerpo solo iniciamos Ver estructuras de datos que son tipos de valor súper rápidos. La función del cuerpo se llama repetidamente y después SwiftUI ha diferenciado y actualizado las etiquetas, etc. en la pantalla, todas estas estructuras de vista se descartan.
  4. Su body es demasiado grande, se supone que debemos dividirlo en vistas pequeñas con una pequeña cantidad de let s o @State s. A esto se le llama tener una invalidación estricta. La razón es que SwiftUI presenta dependencia y seguimiento de cambios, y si el cuerpo es demasiado grande, no será eficiente. Nombrar las estructuras puede ser complicado dado que se basan en datos y no en áreas de la pantalla, comience con ContentView1 , ContentView2 , etc. hasta que descubra un buen esquema de nombres, por ejemplo, algunas Vistas basadas en las propiedades.

Recomiendo ver WWDC 2020 Data Essentials en SwiftUI para aprender el uso adecuado de SwiftUI.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda