Eu tenho atualizado meus aplicativos para rodar no iOS 7, que está indo bem na maior parte do tempo. Observei em mais de um aplicativo que o reloadData
método de a UICollectionViewController
não está agindo como antes.
Vou carregar o UICollectionViewController
, preencher o UICollectionView
com alguns dados normalmente. Isso funciona muito bem na primeira vez. No entanto, se eu solicitar novos dados (preencher o UICollectionViewDataSource
) e, em seguida reloadData
, chamar , ele consultará a fonte de dados por numberOfItemsInSection
e numberOfSectionsInCollectionView
, mas não parece chamar cellForItemAtIndexPath
o número adequado de vezes.
Se eu alterar o código para recarregar apenas uma seção, ele funcionará corretamente. Não é problema para mim alterá-los, mas acho que não deveria ser necessário. reloadData
deve recarregar todas as células visíveis de acordo com a documentação.
alguém mais viu isso?
fonte
reloadData
após viewDidAppear parece resolver o problema, sua horrível solução alternativa e precisa de conserto. Espero que alguém ajude aqui.Respostas:
Force isso no tópico principal:
fonte
No meu caso, o número de células / seções na fonte de dados nunca mudou e eu só queria recarregar o conteúdo visível na tela.
Consegui contornar isso ligando para:
então:
fonte
performBatchUpdates:completion:
bloco?Eu tive exatamente o mesmo problema, mas consegui descobrir o que estava acontecendo de errado. No meu caso, eu estava chamando reloadData de collectionView: cellForItemAtIndexPath: que parece não estar correto.
O envio da chamada de reloadData para a fila principal corrigiu o problema de uma vez por todas.
fonte
reloadData
fui chamado por um observador de mudanças.collectionView(_:willDisplayCell:forItemAtIndexPath:)
Recarregar alguns itens não funcionou para mim. No meu caso, e apenas porque a collectionView que estou usando tem apenas uma seção, simplesmente recarrego essa seção específica. Desta vez, o conteúdo é recarregado corretamente. Estranho que isso só esteja acontecendo no iOS 7 (7.0.3)
fonte
Tive o mesmo problema com reloadData no iOS 7. Após uma longa sessão de depuração, encontrei o problema.
No iOS7, reloadData em UICollectionView não cancela atualizações anteriores que ainda não foram concluídas (atualizações que chamam dentro de performBatchUpdates: block).
A melhor solução para resolver este bug, é parar todas as atualizações que estão sendo processadas e chamar reloadData. Não encontrei uma maneira de cancelar ou interromper um bloco de performBatchUpdates. Portanto, para resolver o bug, salvei um sinalizador que indica se há um bloco performBatchUpdates que está sendo processado. Se não houver um bloco de atualização processado atualmente, posso chamar reloadData imediatamente e tudo funciona conforme o esperado. Se houver um bloco de atualização que está sendo processado atualmente, chamarei reloadData no bloco completo de performBatchUpdates.
fonte
Swift 5 - 4 - 3
Swift 2
fonte
Eu também tive esse problema. Por coincidência, adicionei um botão no topo da visualização da coleção para forçar o recarregamento para teste - e de repente os métodos começaram a ser chamados.
Além disso, basta adicionar algo tão simples como
faria com que os métodos fossem chamados
Também brinquei com o tamanho do quadro - e voila os métodos estavam sendo chamados.
Existem muitos bugs no iOS7 UICollectionView.
fonte
Você pode usar este método
Você pode adicionar todos os seus
indexPath
objetosUICollectionView
no arrayarrayOfAllIndexPaths
iterando o loop para todas as seções e linhas com o uso do método abaixoEspero que você tenha entendido e possa resolver seu problema. Se precisar de mais explicações, responda.
fonte
A solução dada por Shaunti Fondrisi é quase perfeita. Mas um trecho de código ou códigos como enfileirar a execução de
UICollectionView
'sreloadData()
paraNSOperationQueue
' s demainQueue
fato coloca o tempo de execução no início do próximo loop de evento no loop de execução, o que poderia fazer aUICollectionView
atualização com um toque.Para resolver esse problema. Devemos colocar o tempo de execução do mesmo trecho de código no final do loop de evento atual, mas não no início do próximo. E podemos conseguir isso fazendo uso de
CFRunLoopObserver
.CFRunLoopObserver
observa todas as atividades de espera da fonte de entrada e a atividade de entrada e saída do loop de execução.Entre essas atividades,
.AfterWaiting
pode ser observado quando o loop de evento atual está prestes a terminar e.BeforeWaiting
pode ser observado quando o próximo loop de evento acaba de começar.Como existe apenas uma
NSRunLoop
instância porNSThread
eNSRunLoop
exatamente conduz oNSThread
, podemos considerar que os acessos vêm da mesmaNSRunLoop
instância sempre nunca cruzam os threads.Com base nos pontos mencionados antes, agora podemos escrever o código: um despachante de tarefas baseado em NSRunLoop:
Com o código anterior, podemos agora despachar a execução de
UICollectionView
'sreloadData()
para o final do loop de evento atual por meio de um trecho de código:Na verdade, esse despachante de tarefas baseado em NSRunLoop já esteve em um dos meus frameworks pessoais usados: Nest. E aqui está seu repositório no GitHub: https://github.com/WeZZard/Nest
fonte
funcionou para mim.
fonte
Obrigado em primeiro lugar por este tópico, muito útil. Tive um problema semelhante com Reload Data, exceto que o sintoma era que células específicas não podiam mais ser selecionadas de forma permanente, enquanto outras podiam. Nenhuma chamada para o método indexPathsForSelectedItems ou equivalente. Depuração apontada para Recarregar Dados. Tentei as duas opções acima; e acabei adotando a opção ReloadItemsAtIndexPaths, pois as outras opções não funcionavam no meu caso ou faziam a visualização da coleção piscar por um milissegundo ou mais. O código abaixo funciona bem:
fonte
Aconteceu comigo também no SDK do iOS 8.1, mas acertei quando percebi que mesmo após atualizar
datasource
o métodonumberOfItemsInSection:
não estava retornando a nova contagem de itens. Eu atualizei a contagem e comecei a funcionar.fonte
Você define UICollectionView.contentInset? remova o edgeInset esquerdo e direito, tudo está ok depois de removê-los, o bug ainda existe no iOS8.3.
fonte
Verifique se cada um dos métodos UICollectionView Delegate faz o que você espera que faça. Por exemplo, se
não retorna um tamanho válido, o recarregamento não funciona ...
fonte
tente este código.
fonte
Aqui está como funcionou para mim no Swift 4
fonte
fonte