Подтвердить что ты не робот

CellForItemAtIndexPath не вызывается, но numberOfItemsInSection делает

Это может быть дубликат сообщения, но я не нашел решение ни в одном из них:

enter image description here

Я устанавливаю свой UICollectionView как:

UINib *nib = [UINib nibWithNibName:@"CollectionViewCell"
                           bundle:[NSBundle mainBundle]];
[_collectionView registerNib: nib forCellWithReuseIdentifier:@"bCell"];

(я попытался установить делегат без делегата и т.д.).

Но тогда только

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section вызывается в то время как

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath не работает.

Я проверил numberOfItemsInSection, и он всегдa > 0 (это ровно 17).

Я проверил вызов [_collectionView reloadData];, и ничего не происходит.

Я пробовал разные вещи, но я не могу заставить его работать.

Кроме того, мой UICollectionView должен быть здесь, но это не так:

enter image description here

Кто-нибудь знает? Спасибо.

4b9b3361

Ответ 1

Хорошо, я думаю, что это может быть полезно для будущих проблем с этим...

Это было из-за ограничений на StoryBoard. Я не понимаю, почему это происходит, потому что я только что зафиксировал горизонтальное пространство. Я удалил горизонтальное пространство как ограничение для этого представления, и все работает нормально.

Хорошо, пусть жизнь протекает.

Ответ 2

1. cellForItemAtIndexPath вызывается, когда вы возвращаете более 0 элементов в методе numberOfItemsInSection.

2. Убедитесь, что ваш UICollectionViewFlowLayout является правильным или вашим собственным. UICollectionViewLayout - абстрактный класс, который вы не можете использовать напрямую

3. Проверьте размер ячейки представления коллекции и Вид коллекции.

4. Постарайтесь установить размер коллекции в коде. [yourCollectionViewFlowLayout setItemSize: CGSizeMake (200, 200)];

5. Если какой-либо из них НЕ работает, то уничтожьте XCode и перезапустите. Иногда это исправляет проблему.

Apple говорит

Класс UICollectionViewLayout является абстрактным базовым классом, который вы подклассифицируете и используете для генерации информации о макете для представления коллекции. Задача объекта макета состоит в том, чтобы определить размещение ячеек, дополнительных представлений и украшений в пределах границ коллекций и сообщить об этом информации в виде коллекции по запросу. Затем представление коллекции применяет предоставленную информацию о макете к соответствующим представлениям, чтобы их можно было отображать на экране.

Вы должны подклассифицировать UICollectionViewLayout, чтобы использовать его. Однако, прежде чем рассматривать подклассу, вы должны посмотреть на класс UICollectionViewFlowLayout, чтобы узнать, можно ли его адаптировать к вашим требованиям к макету.

Ответ 3

Я также сталкиваюсь с той же проблемой и, наконец, узнал, что я прошел неправильный объект класса для коллекцииViewLayout, я изменяю UICollectionViewFlowLayout вместо UICollectionViewLayout, создавая объект для UICollectionView, например под его устаревшим вызовом всех методов делегата.

 collectionView = UICollectionView(frame: CGRectMake(5, 0, 400, 40) , collectionViewLayout: UICollectionViewFlowLayout())

Ответ 4

Добавьте это для просмотраDidLoad:

self.automaticallyAdjustsScrollViewInsets = NO;

Ответ 5

Я тоже сталкиваюсь с этой проблемой. Я проверил все возможные проблемы, все выглядит хорошо. Затем я попытался изменить методы перезагрузки.

[self.colView reloadData][self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:x]];

Тогда все работало. Однако я все еще не понимаю, как.

Ответ 6

Я только что обнаружил, что NONE cellForItemAtIndexPath вызывается (в iOS 10), если хотя бы одна ячейка имеет высоту нуля.

Отказ от ответственности: извините, если это должен был быть комментарий - недостаточно репутации.

Ответ 7

Для меня cellForItemAtIndexPath не вызывается в первый раз после того, как я установил ограничение collectionView равным 0, а затем снова установил для него фактический размер.

 @IBOutlet weak var collectionVwHeightContraint: NSLayoutConstraint!
 if attachments.count > 0 {

     collectionVwHeightContraint.constant = 100
 }else {

     collectionVwHeightContraint.constant = 0
 }
 // collectionVwHeightContraint is my collectionView height Contraint outlet

Я решил это, позвонив:

self.view.layoutIfNeeded()

Надеюсь, это поможет кому-то :)

Ответ 8

Что мне помогло - установить правильный itemSize. Мой cellForItemAtIndexPath не вызывался из-за неправильной высоты.

Итак, я установил размер:

[self.myCollectionViewFlowLayout setItemSize:CGSizeMake(170, 300)];

Ответ 9

Для меня проблема заключалась в том, что я создавал свой Collection View программно, но я дал ему CGRectZero как свой фрейм. Я выложил его с помощью Auto Layout после viewDidLoad. Если я выложу представление коллекции во время загрузки контроллера просмотра, он в конечном итоге вызывает cellForItemAtIndexPath: правильно.

Ответ 10

Для меня было то, что у моего контейнера collectionView не было translatesAutoresizingMaskIntoConstraints = false

Ответ 11

У меня была такая же проблема с выходом коллекционного просмотра на раскадровке со "стандартными" ограничениями (снизу, сверху, впереди, с привязкой к внутреннему виду).

Я решил таким образом:

let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
layout.itemSize = self.collectionView.frame.size

Ответ 12

Я столкнулся с подобной проблемой. Проблема была с количеством элементов в разделе. Ваш cellForRowAtIndexPath может не вызываться, если число ваших разделов или количество строк в разделе меньше нуля.

Ответ 13

В моем случае я испортил свои собственные ограничения на метки ячеек. Проверьте ваши ограничения еще раз.

Ответ 14

reza_khalafi ответ работал для меня, я использую Xcode 11 и swift 4.2. Swift 4.2 версия Реза ответа.

добавить это на viewDidLoad

self.automaticallyAdjustsScrollViewInsets = false

Ответ 15

Может помочь кому-то еще, это может быть 2 вещи:

  1. Высота ячейки не рассчитана должным образом, поэтому необходимо проверить ограничения ячейки.

Чтобы это исправить, я реализовал метод UICollectionViewLayout: расширение TableViewCellActionItemPageControl: UICollectionViewDelegateFlowLayout {

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return CGSize(width: 414, height: 213) 
}
  1. Другая возможность: размер возвращаемой ячейки представления коллекции больше, чем само представление коллекции. Убедитесь, что высота вашей клетки меньше, чем высота вашего коллектива.