cellForItemAtIndexPath未调用但numberOfItemsInSection调用

Raf*_*ñoz 51 objective-c ios uicollectionview

这可能是一个重复的帖子,但我没有找到任何一个解决方案:

在此输入图像描述

我把我UICollectionView设为:

UINib *nib = [UINib nibWithNibName:@"CollectionViewCell"
                           bundle:[NSBundle mainBundle]];
[_collectionView registerNib: nib forCellWithReuseIdentifier:@"bCell"];
Run Code Online (Sandbox Code Playgroud)

(我试图设置委托,没有委托,等等).

但那时,只有

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section 被召唤的时候

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 没有.

我已经检查了我返回的numberOfItemsInSection,它总是> 0(它正好是17).

我已经检查过电话[_collectionView reloadData];,也没有任何反应.

我尝试了不同的东西,但我不能让它发挥作用.

此外,我UICollectionView应该在这里,但它不是:

在此输入图像描述

有人有线索吗?谢谢.

Raf*_*ñoz 43

好吧,我认为这可能对今后的问题有用......

这是因为StoryBoard的限制.我真的不明白为什么会发生这种情况,因为我只是固定了一个水平空间.我删除了水平空间作为该视图的约束,一切正常.

好吧,让生命流畅.

  • 我错过了一个身高限制.谢谢你的提示.保证给我一些肯定的时间.:) (7认同)
  • 奇怪的是,这仍然有效。:) 我真的很想弄清楚问题是什么,然后在我看到这个之后,就创建了一个高度约束,它开始工作了。 (2认同)
  • 非常感谢!我认为苹果出现这个问题有点愚蠢。也许我不想要约束! (2认同)

Nar*_*ana 18

我也面临同样的问题,最后知道我已经为collectionViewLayout传递了错误的类对象,我在为UICollectionView创建对象时更改为UICollectionViewFlowLayout而不是UICollectionViewLayout,就像在它下面调用所有委托方法一样.

 collectionView = UICollectionView(frame: CGRectMake(5, 0, 400, 40) , collectionViewLayout: UICollectionViewFlowLayout())
Run Code Online (Sandbox Code Playgroud)

  • 我只花了大约2个小时来找到这个错误,我希望我之前能读到这个答案! (2认同)

Vij*_*com 17

1.当您在numberOfItemsInSection方法上返回超过0个项目时,将调用cellForItemAtIndexPath.

2.检查您的UICollectionViewFlowLayout是否正确或您自己的.UICollectionViewLayout是抽象类,不能直接使用它

3.检查集合视图单元格和集合视图的大小.

4.尝试在代码中设置您的集合视图大小. [yourCollectionViewFlowLayout setItemSize:CGSizeMake(200,200)];

5.如果它们中的任何一个不起作用,那么杀死XCode并重启.有时它会解决问题.

Apple说

UICollectionViewLayout类是一个抽象基类,您可以将其子类化并用于生成集合视图的布局信息.布局对象的工作是确定集合视图边界内的单元格,补充视图和装饰视图的位置,并在询问时将该信息报告给集合视图.然后,集合视图将提供的布局信息应用于相应的视图,以便可以在屏幕上显示它们.

您必须子类化UICollectionViewLayout才能使用它.但是,在考虑子类化之前,您应该查看UICollectionViewFlowLayout类,看看它是否可以适应您的布局需求.


rez*_*afi 16

将其添加到viewDidLoad:

self.automaticallyAdjustsScrollViewInsets = NO;
Run Code Online (Sandbox Code Playgroud)


fra*_*ank 14

我也遇到了这个问题.我检查了所有可能的问题,一切看起来都不错.然后我试着改变了重载方法.

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

所有事情都奏效了.但是我还是不明白怎么做.

  • 谢谢,伙计,真的很有帮助,非常感谢你. (2认同)

小智 8

我刚刚发现,只要至少一个单元格的高度为零,就会调用NONE of cellForItemAtIndexPath(在iOS 10中).

免责声明:对不起,如果这应该是一个评论 - 没有足够的声誉.


Ari*_*dar 7

对我来说,在我将 collectionView 的约束设置为 0 然后再次将其设置为其实际大小后,第一次没有调用cellForItemAtIndexPath

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

     collectionVwHeightContraint.constant = 100
 }else {

     collectionVwHeightContraint.constant = 0
 }
 // collectionVwHeightContraint is my collectionView height Contraint outlet
Run Code Online (Sandbox Code Playgroud)

我通过调用解决了这个问题:

self.view.layoutIfNeeded()
Run Code Online (Sandbox Code Playgroud)

希望它会帮助某人:)