AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 76947779
Accepted
Vcubbz
Vcubbz
Asked: 2023-08-22 02:09:30 +0800 CST2023-08-22 02:09:30 +0800 CST 2023-08-22 02:09:30 +0800 CST

UITableViewCell com UICollectionView aninhado mostrando dados duplicados

  • 772

Eu tenho uma visualização de tabela onde cada célula contém uma visualização de coleção. Cada visualização da coleção possui uma apresentação de slides horizontal de imagens. Cada célula de visualização de tabela é configurada com um modelo de visualização, que contém uma matriz de imageURLs para a visualização de coleção aninhada usar como fonte de dados. Tudo funciona bem até que preciso carregar minha segunda página de dados. Depois de carregar minha segunda página de dados na visualização de tabela, os itens da segunda página parecem ser duplicatas dos itens da primeira página. Mas é estranho porque também tenho um controle de página nesta visualização de coleção que está configurado com a contagem do array imageURLs, e o número de páginas está correto. Apenas as próprias imagens estão duplicando a primeira página.

Aqui está o cellForRow na visualização da tabela:

  override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: DataTableViewCell.id, for: indexPath) as! DataTableViewCell
    cell.delegate = self
    cell.configureWith(viewModel.getViewModelAt(indexPath.row))
  
    return cell
  }

Aqui está o cellForItem na visualização da coleção aninhada:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    
    if indexPath.row == 0 {
      let cell = collectionView.dequeueReusableCell(withReuseIdentifier: CensoredDataCollectionViewCell.id, for: indexPath) as! CensoredDataCollectionViewCell
      cell.setRemoteImage(with: viewModel.photoGalleryURLStrings[0])
      
      return cell
    }
    
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: ImageCollectionViewCell.id, for: indexPath) as! ImageCollectionViewCell
    let imageURLString = viewModel.photoGalleryURLStrings[indexPath.row - 1]
    cell.setRemoteImage(with: imageURLString)

    return cell
  }

O setRemoteImagemétodo apenas define a visualização da imagem da célula a partir de uma imagem no servidor. Isso indexPath.row - 1ocorre porque a visualização da coleção possui uma célula extra no início.

Aqui está o código no controlador de visualização que faz uma nova chamada de rede ao chegar ao fundo:

override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if indexPath.row == viewModel.dataCount - 1 {
      tableViewFooterLoadingWheel.startAnimating()
      viewModel.downloadData { [weak self] moreData in

        if moreData {
          DispatchQueue.main.async {
            self?.tableView.reloadData()
          }
        }
        
        DispatchQueue.main.async {
          self?.tableViewFooterLoadingWheel.stopAnimating()
        }
      }
    }
  }

Aqui está o caso de sucesso da chamada de rede onde novos itens são anexados à fonte de dados:

case .success(let result):
  strongSelf.data.append(contentsOf: result.results)
        
  if let next = result.next {
    strongSelf.dataURL = next
  } else {
    strongSelf.dataURL = nil
  }
 
  completion(true)

Para teste, a chamada de rede inicial me dará 5 itens para minha visualização de tabela. Os dois primeiros itens possuem apenas uma imagem para a visualização da coleção aninhada. Depois de carregar minha segunda página, que para fins de teste possui apenas 2 itens, esses dois itens têm as mesmas imagens que os dois primeiros na página 1. Mas, como mencionei, o número de páginas de controle de página é mapeado para o número correto de URLs de imagem . Então, em algum lugar a contagem de imagens está completamente correta. Apenas não a imagem real.

Desculpas se algum deste código não for necessário. Por favor, não recomende que eu redefina o conteúdo em prepareForReuse() a menos que isso seja tudo que posso fazer, como a Apple diz para não fazer isso. Desde já agradeço se puder me ajudar.

Editado para incluir a função configureWith():

func configureWith(_ viewModel: dataViewModel) {
  self.dataViewModel = viewModel
  
  loadingWheel.startAnimating()
  avatarImageView.loadImageFromURL(dataViewModel.avatarImageURLString) { [weak self] in
    DispatchQueue.main.async {
      self?.loadingWheel.stopAnimating()
    }
  }
  statusLabel.text = dataViewModel.status
  createdAtLabel.text = dataViewModel.created
  photoGalleryPageControl.numberOfPages = dataViewModel.photoGalleryURLStrings.count
  likesCountLabel.text = "\(dataViewModel.likeCount)"
  
  likesButton.isSelected = dataViewModel.isLiked

  commentsCountLabel.text = dataViewModel.commentCount
}
ios
  • 1 1 respostas
  • 24 Views

1 respostas

  • Voted
  1. Best Answer
    DonMag
    2023-08-22T05:01:57+08:002023-08-22T05:01:57+08:00

    As células da visualização de tabela são reutilizadas ...

    Como você viu, você precisa chamar .reloadData()a visualização de coleção incorporada ao definir novos dados para a célula.

    Para o segundo problema - a visualização da coleção incorporada não é "recriada" quando a célula é reutilizada. Isso significa que sua posição de rolagem (seu deslocamento de conteúdo) não muda.

    Se quiser que a visualização da coleção comece na primeira célula sempre que uma linha for rolada para view , você também precisará chamar:

    collectionView.scrollToItem(at: IndexPath(item: 0, section: 0), at: .left, animated: false)
    

    quando a célula é configurada/mostrada.

    Se você deseja que a posição de rolagem da visualização da coleção permaneça a mesma enquanto você rola a tabela, ou seja:

    • linha 0 da tabela, role a visualização da coleção horizontal até a célula 8
    • role para baixo a visualização da tabela
    • role a visualização da tabela de volta ao topo e tenha sua visualização de coleção ainda rolada para a célula 8

    então você precisará rastrear o deslocamento do conteúdo da visualização da coleção em seu controlador de visualização de tabela para cada linha.

    • 0

relate perguntas

  • Por que a entrada de texto multilinha do IOS não funciona corretamente no diálogo de papel nativo do React?

  • É possível gravar a reprodução de um vídeo sem perder a qualidade do vídeo?

  • Swift locationManager.requestWhenInUseAuthorization() não está solicitando ao usuário

  • obtenha o UIBezierPath da imagem sem área transparente

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve