Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

362
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda