Только второй раз использую UICollectionView, и, возможно, я откусил больше, чем могу прожевать, но тем не менее:
Я реализую UICollectionView (myCollectionView), который использует пользовательский UICollectionViewCell, который я подклассифицировал. Подклассы ячеек (FullReceiptCell) содержат UITableView и имеют размер контроллера представления. Я пытаюсь разрешить горизонтальную прокрутку между FullReceiptCells.
Подкласс UICollectionViewController, содержащий myCollectionView, помещается в стек контроллера навигации. В настоящее время включены функции myCollectionView и горизонтальная прокрутка. Однако ячеек не видно. Я подтвердил это
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
выполняется и возвращает целое число больше 0. Я также подтвердил, что делегат myCollectionView и источник данных правильно установлены в IB для подкласса UICollectionViewController.
Метод загрузки ячеек:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
не называется.
Здесь я нажимаю UICollectionViewController и свой метод viewDidLoad внутри этого контроллера (ПРИМЕЧАНИЕ: initWithBill является переопределением обычного инициализатора):
В предыдущем файле ViewControllers .m:
FullReceiptViewController *test = [[FullReceiptViewController alloc] initWithBill:currentBill];
test.title = @"Review";
[self.navigationController pushViewController:test animated:YES];
В 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];
Есть какие-нибудь подсказки относительно того, почему его не называют?
источник
Ответы:
Для тех, кто тут споткнется позже .... причина:
не был вызван из-за слишком большой высоты itemSize для коллекцииViewFlowLayout.
Если я изменю высоту на 410, он выполнит cellForItemAtIndexPath.
источник
Adjust Scroll View Insets
ViewController в Storyboard.В моем случае это произошло из-за того, что мой класс макета некорректно подклассифицирован
UICollectionViewLayout
вместоUICollectionViewFlowLayout
источник
CellForItemAtIndexPath не будет вызываться, если вы не предоставите информацию о размере содержимого в представление коллекции.
В случае последнего вы также заметите, что ваш layoutAttributesForElementsRect также не вызывается. Причина в том, что вы не указали размер вашего контента, и по умолчанию размер будет CGSizeZero. Это в основном сообщает представлению коллекции о том, что у вас нет контента для рисования, поэтому он не беспокоит вас об атрибутах или ячейках.
Итак, просто переопределите collectionViewContentSize и укажите там правильный размер, это должно решить вашу проблему.
источник
collectionViewContentSize
для ширины было неправильно возвращено 0, поэтому функцияcellForItemAtIndexPath
не вызывалась.Может, я просто не замечаю этого, но похоже, что вам не хватает делегата и источника данных. Убедитесь, что вы добавили в заголовочный файл:
и в вашем методе viewDidLoad добавьте это:
Кроме того, если вы загружаете его через .xib, убедитесь, что вы подключили IBOutlet к UICollectionView.
источник
Для более сложной иерархии представлений, пожалуйста, посетите этот блог . Это спасло мне жизнь!
источник
Если ваш класс является подклассом UICollectionviewController и вы создаете collectionView программно, используйте
источник
Я использовал автоматическую раскладку, и в моем случае ограничение высоты отсутствовало
источник
Моя проблема заключалась в том, что у меня было 2 представления коллекций в одном представлении, и оба использовали вычисляемый
UICollectionViewFlowLayout
экземпляр. Как только я создал отдельные экземпляры одного и того же макета потока, все заработало.источник
В моем случае я очень глупо забыл реализовать
UICollectionViewDataSource
метод протоколаnumberOfItemsInSection
, так что это еще одна вещь, которую нужно проверить.источник
Кроме того, убедитесь, что reloadData не вызывается во время обновления представления коллекции с помощью анимации (вставка, удаление, обновление или performBatchUpdates).
источник
В моем случае набор
collectionView.prefetchingEnabled = NO;
решил мою проблему. Работает только на iOS 10.источник
Это происходило для меня, когда высота элемента == 0, исправляя этот метод cellForItem, был вызван.
источник
Десять минут назад я тоже столкнулся с этой проблемой, сделал глупую ошибку.
Я намерен использовать UICollectionViewFlowLayout,
Но из-за ошибок я использовал UICollectionViewLayout.
источник
В моем случае изменение полупрозрачности UINavigationBar на NO решило проблему.
источник
В Xcode 7.0.1 мы столкнулись с этой проблемой, когда скопировали раскадровку и сопутствующий код из другого проекта. Представление коллекции имело настраиваемый макет потока, установленный в раскадровке. Решение было:
Теперь заработало :)
источник
Убедитесь, что также
numberOfSectionsInCollectionView
возвращает положительное целое число.В коллекции должен быть хотя бы один раздел.
источник
Убедитесь, что - (NSInteger) collectionView: numberOfItemsInSection: возвращает положительное (прочитанное, больше нуля) значение. Это может быть вопрос размещения [self.collectionView reloadData]; в обработчике завершения.
источник
Я забыл установить для маски автоматического изменения размера значение false в представлении коллекции:
источник
Это могут быть проблемы с версткой. Проверьте предупреждения о макете с консоли, если они есть.
источник
В моем случае представление коллекции не было полностью видно в родительском представлении из-за неправильных ограничений автоматического макета. Таким образом, исправление ограничений сделало представление коллекции полностью видимым, и был вызван cellForItemAtIndexPath.
источник
В раскадровке / xib свойство UICollectionView cellSize НЕ ДОЛЖНО быть {0, 0}
источник
Если вы используете вид сбора протоколов необходимо подключить
CollectionViewDataSource
иCollectionViewDelegate
протоколы к вашему ViewController.источник
То же случилось и со мной. У меня было 2 UICollectionView, и я удалил один раз, так как мне это не нужно. После этого я понял, что вызывается не CellForItemAtIndexPath, а другие необходимые методы. Я пробовал все вышеперечисленное, но потом проделал стандартную магию. Удалено представление коллекции из раскадровки и добавлено снова. Потом заработало. Не знаю, почему, и у меня нет объяснений, но, возможно, некоторые проблемы с подключением.
источник
Только что решил эту проблему для определенной ситуации.
В моем случае я вручную инициализировал UICollectionViewController в родительском ViewController, а затем добавлял представление UICollectionViewController в качестве подпредставления.
Я решил проблему, вызвав setNeedsLayout и / или setNeedsDisplay в collectionView в родительском viewDidAppear:
источник
При использовании
UICollectionViewDelegateFlowLayout
будьте осторожны с тем, что возвращает эта функция. Обаwidth
иheight
должны быть больше, чем0
. Я использовалwindow
как ссылку на кадр, но из-за сложной иерархии представлений окно находилосьnil
во время выполнения. Если вам нужно настроить ширину элемента в зависимости от ширины экранаUIScreen.main.bounds
.источник
У меня была аналогичная проблема. Но вместо этого
cellForItemAtIndexPath
был вызван, когда количество элементов было> 1, а не когда был только один элемент. Я пробовал многие из предложенных здесь решений и, как и многие, обнаружил, что это связано с размером элемента. Для меня решением было изменить размер оценкиUICollectionView
с Автоматического на Пользовательский .источник
В моем случае у меня был
collectionView
файлUIStackView
сalignment = .center
. Значит, у нихcollectionView
не было ширины. При выставленииstackView.alignment
на.fill
все было хорошо.источник
Для меня я обновляю высоту self.view (супервизора collectionView) через autolayout и ДОЛЖЕН вызывать
layoutIfNeeded
после этого.источник
В моем случае мне пришлось настроить предполагаемый размер содержимого. размер содержимого не делал этого.
источник
Я потратил немного времени на то, чтобы решить эту проблему с помощью CollectionView в контроллере автономного представления, загруженном из раскадровки. Я закончил тем, что просто удалил содержащийся контроллер представления и воссоздал его в раскадровке, и, похоже, это избавило от проблемы. Я предполагаю, что произошло какое-то искажение раскадровки.
источник