Apenas minha segunda vez usando UICollectionView's e talvez eu tenha mordido mais do que posso mastigar, mas mesmo assim:
Estou implementando um UICollectionView (myCollectionView) que usa UICollectionViewCell personalizado que criei como subclasse. As células subclassed (FullReceiptCell) contêm UITableView's e são do tamanho do viewcontroller. Estou tentando permitir a rolagem horizontal entre FullReceiptCells.
A subclasse UICollectionViewController que contém myCollectionView está sendo enviada para uma pilha de controlador de navegação. Atualmente, myCollectionView loas e rolagem horizontal estão habilitados. No entanto, nenhuma célula é visível. Eu confirmei que
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
foi executado e está retornando um número inteiro maior que 0. Também confirmei que o delegado e a fonte de dados de myCollectionView estão configurados corretamente em IB para a subclasse UICollectionViewController.
O método em que as células devem ser carregadas:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
não está sendo chamado.
Aqui é onde eu empurro o UICollectionViewController e meu método viewDidLoad dentro desse controlador (NOTA: initWithBill é uma substituição do inicializador normal):
No arquivo ViewControllers .m anterior:
FullReceiptViewController *test = [[FullReceiptViewController alloc] initWithBill:currentBill];
test.title = @"Review";
[self.navigationController pushViewController:test animated:YES];
Em FullReceiptViewController.m:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
[self.myCollectionView registerClass:[FullReceiptCell class] forCellWithReuseIdentifier:@"FullReceiptCellIdentifier"];
self.myCollectionView.pagingEnabled = YES;
// Setup flowlayout
self.myCollectionViewFlowLayout = [[UICollectionViewFlowLayout alloc] init];
[self.myCollectionViewFlowLayout setItemSize:CGSizeMake(320, 548)];
[self.myCollectionViewFlowLayout setSectionInset:UIEdgeInsetsMake(0, 0, 0, 0)];
[self.myCollectionViewFlowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
self.myCollectionViewFlowLayout.minimumLineSpacing = 0;
self.myCollectionViewFlowLayout.minimumInteritemSpacing = 0;
[self.myCollectionView setCollectionViewLayout:myCollectionViewFlowLayout];
//testing to see if the collection view is loading
self.myCollectionView.backgroundColor = [UIColor colorWithWhite:0.25f alpha:1.0f];
Alguma pista de por que não está sendo chamado?
fonte
Respostas:
Para quem tropeçar aqui mais tarde .... o motivo:
não estava sendo chamado porque o itemSize para a altura da coleçãoViewFlowLayout era muito grande.
Se eu alterar a altura para 410, ele executará cellForItemAtIndexPath.
fonte
Adjust Scroll View Insets
em seu ViewController no Storyboard.No meu caso, foi porque minha classe de layout criou uma subclasse incorreta de em
UICollectionViewLayout
vez deUICollectionViewFlowLayout
fonte
O cellForItemAtIndexPath não será chamado se você não fornecer as informações de tamanho do conteúdo para a visualização da coleção.
No caso do último, você também observará que seu layoutAttributesForElementsRect também não é chamado. O motivo é que você não especificou o tamanho do seu conteúdo e, por padrão, o tamanho será CGSizeZero. Isso basicamente informa ao modo de exibição de coleção que você não tem nenhum conteúdo para pintar, então não se preocupa em solicitar atributos ou células.
Portanto, apenas substitua collectionViewContentSize e forneça um tamanho apropriado lá, isso deve resolver seu problema.
fonte
collectionViewContentSize
retornou 0 incorretamente para a largura, é por isso que ocellForItemAtIndexPath
não estava sendo chamado.Talvez eu esteja apenas esquecendo, mas parece que você está perdendo seu delegado e fonte de dados. Em seu arquivo de cabeçalho, certifique-se de adicionar estes:
e em seu método viewDidLoad adicione isto:
Além disso, se você estiver carregando-o por meio de um .xib, certifique-se de ter conectado o IBOutlet ao UICollectionView.
fonte
Para uma hierarquia de visão mais complicada, verifique este blog . Isso salvou minha vida!
fonte
Se sua classe é uma subclasse de UICollectionviewController e você está criando collectionView programaticamente, use
fonte
Eu estava usando autolayout e, no meu caso , faltava restrição de altura
fonte
Meu problema era que eu tinha 2 visualizações de coleção na mesma visualização e ambas compartilhavam uma
UICollectionViewFlowLayout
instância computada . Depois de criar instâncias separadas do mesmo layout de fluxo, funcionou bem.fonte
No meu caso, o que eu tinha esquecido estupidamente de fazer foi implementar o
UICollectionViewDataSource
método do protocolonumberOfItemsInSection
, então isso é outra coisa a verificar.fonte
Além disso, certifique-se de que reloadData não seja chamado enquanto a visualização da coleção está sendo atualizada com animação (inserir, excluir, atualizar ou executarBatchUpdates).
fonte
No meu caso, set
collectionView.prefetchingEnabled = NO;
resolveu meu problema. Funciona apenas no iOS 10.fonte
Isso estava acontecendo comigo quando o item height == 0 fixando que o método cellForItem foi chamado.
fonte
Dez minutos atrás eu também encontrei esse problema, cometi um erro bobo.
Minha intenção é usar UICollectionViewFlowLayout,
Mas por causa de erros, usei UICollectionViewLayout.
fonte
No meu caso, alterar o translúcido de UINavigationBar para NÃO resolveu o problema.
fonte
No Xcode 7.0.1, tivemos esse problema quando copiamos um storyboard e o código que o acompanhava de outro projeto. A visualização da coleção tinha um layout de fluxo customizado definido no storyboard. A solução foi:
Agora deu certo :)
fonte
Certifique-se de
numberOfSectionsInCollectionView
retornar um número inteiro positivo também.Deve haver pelo menos uma seção da coleção.
fonte
Certifique-se de que - (NSInteger) collectionView: numberOfItemsInSection: está retornando um valor positivo (leitura, maior que zero). Pode ser uma questão de colocar [self.collectionView reloadData]; no manipulador de conclusão.
fonte
Esqueci de definir a máscara de redimensionamento automático como falsa na visualização da coleção:
fonte
Podem ser problemas de layout relacionados. Verifique os avisos de layout do console, se houver.
fonte
No meu caso, a visualização da coleção não estava totalmente visível na visualização pai devido a restrições de layout automático incorretas. Portanto, corrigir as restrições tornou a visualização da coleção totalmente visível e cellForItemAtIndexPath foi chamado.
fonte
No storyboard / xib UICollectionView, a propriedade cellSize não DEVE ser {0, 0}
fonte
Se estiver usando protocolos de exibição de coleção, você deve conectar os protocolos
CollectionViewDataSource
eCollectionViewDelegate
ao seu ViewController.fonte
O mesmo aconteceu comigo. Eu tinha 2 UICollectionViews e removi uma vez, pois não precisava disso. Depois disso, percebi que CellForItemAtIndexPath não estava sendo chamado, mas sim os outros métodos necessários. Tentei todos os itens acima, mas depois fiz a mágica padrão. Removida a visualização da coleção do storyboard e adicionada novamente. Então começou a funcionar. Não sei por que e não tenho nenhuma explicação, mas talvez alguns problemas de conexão.
fonte
Acabei de resolver esse problema, para uma situação um tanto específica.
No meu caso, eu estava inicializando manualmente o UICollectionViewController em um ViewController pai e, em seguida, adicionando a visualização do UICollectionViewController como uma subvisualização.
Resolvi o problema chamando 'setNeedsLayout' e / ou 'setNeedsDisplay' no collectionView no viewDidAppear do pai:
fonte
Ao usar,
UICollectionViewDelegateFlowLayout
tome cuidado com o que esta função retorna. Amboswidth
eheight
devem ser maiores que0
. Useiwindow
como referência de quadro, mas devido à janela de hierarquia de visualização complicada estavanil
em tempo de execução. Se você precisar ajustar a largura do elemento com base na largura da tela, useUIScreen.main.bounds
.fonte
No meu caso, tive o
collectionView
in aUIStackView
withalignment = .center
. Portanto, ocollectionView
não tinha largura. Ao definir ostackView.alignment
para.fill
tudo estava bem.fonte
Para mim, eu atualizo a altura de self.view (a superview do collectionView) por meio de autolayout e DEVO chamar
layoutIfNeeded
depois disso.fonte
No meu caso, tive que ajustar o tamanho estimado do conteúdo. o tamanho do conteúdo não fazia isso.
fonte
Eu estava tendo um problema semelhante. Em vez disso,
cellForItemAtIndexPath
foi chamado quando o número de itens era> 1, mas não quando havia apenas um único item. Tentei muitas das soluções propostas aqui e, semelhantes a muitas, descobri que tinha a ver com dimensionamento de itens. Para mim, a solução foi alterar o tamanho estimadoUICollectionView
do automático para personalizado .fonte
Eu perdi um pouco de tempo com esse problema vindo de um controlador de exibição CollectionView em um Contained carregado de um storyboard. Acabei simplesmente excluindo o controlador de visualização contido e recriando-o no storyboard, e isso pareceu eliminar o problema. Meu palpite é que ocorreu algum tipo de corrupção do storyboard.
fonte