cellForItemAtIndexPath未调用但numberOfItemsInSection调用

时间:2015-06-12 14:00:03

标签: ios objective-c uicollectionview

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

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 我返回了,它总是> 0(它恰好是17)。

我已经检查过调用[_collectionView reloadData];,但也没有任何事情发生。

我尝试了不同的东西,但我无法使其发挥作用。

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

enter image description here

有没有人有线索? 谢谢。

18 个答案:

答案 0 :(得分:38)

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

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

好吧,让我们的生命流动。

答案 1 :(得分:16)

我也面临同样的问题,最后知道我为collectionViewLayout传递了错误的类对象,我改为 UICollectionViewFlowLayout 而不是 UICollectionViewLayout ,同时为UICollectionView创建对象低于它的凝视所有代表方法。

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

答案 2 :(得分:15)

将此添加到viewDidLoad:

self.automaticallyAdjustsScrollViewInsets = NO;

答案 3 :(得分:13)

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

<强> 2。检查您的UICollectionViewFlowLayout是正确的还是您自己的。 UICollectionViewLayout是抽象类,不能直接使用

第3。检查集合视图单元格的大小&amp;收集视图。

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

5.如果它们中的任何一个不起作用,那么杀死XCode&amp;重新开始 。有时它会解决问题。

Apple说

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

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

答案 4 :(得分:12)

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

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

然后一切顺利。但是我还是不明白怎么做。

答案 5 :(得分:7)

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

免责声明:对不起,如果这应该是评论 - 声誉不够。

答案 6 :(得分:3)

对于我来说,在我将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

我通过以下方式解决了这个问题:

self.view.layoutIfNeeded()

希望它将对某人有所帮助:)

答案 7 :(得分:1)

帮助我的是设置正确的itemSize。由于身高错误,我的cellForItemAtIndexPath没有被调用。

所以我将大小设置为:

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

答案 8 :(得分:1)

对我来说问题是我以编程方式创建了Collection View,但我已经将CGRectZero作为其框架。我在viewDidLoad之后使用自动布局进行布局。如果在加载视图控制器时布置集合视图,它最终会正确调用cellForItemAtIndexPath:

答案 9 :(得分:1)

可能会帮助别人,这可能是两件事:

  1. 单元格的高度计算不正确,因此需要检查单元格的约束。

要解决此问题,我实现了UICollectionViewLayout的方法: 扩展TableViewCellActionItemPageControl:UICollectionViewDelegateFlowLayout {

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return CGSize(width: 414, height: 213) 
}
  1. 其他可能性是:返回的收集视图单元格的大小大于收集视图本身。确保单元格的高度小于集合体的高度。

答案 10 :(得分:0)

要完成@frank答案:(迅速回答)

extension UICollectionView {
   func reloadFirstSection() {
        let indexPath = IndexPath(item: 0, section: 0)
        reloadSections(IndexSet(integer: indexPath.section) )
    }
}

然后调用collectionView.reloadData()而不是collectionView.reloadFirstSection()

答案 11 :(得分:0)

就我而言,它正在交替运行。 然后在主线程上运行 reloadData()并修复了问题。 但是后来经过某些更改后,又出现了同样的问题。最后,我像下面这样。现在没问题了,我觉得 self.view.layoutIfNeeded()起着关键作用

DispatchQueue.main.async {
                self.view.layoutIfNeeded()
                self.collectionView.reloadData()
            }

答案 12 :(得分:0)

在我的情况下,collectionViewCell的高度大于CollectionView的高度。

答案 13 :(得分:0)

reza_khalafi 的答案对我有用,我使用的是Xcode 11和Swift 4.2。 迅速的reza答案的4.2版本。

将此添加到viewDidLoad

self.automaticallyAdjustsScrollViewInsets = false

答案 14 :(得分:0)

就我而言,我搞砸了自定义单元格标签约束。再次验证您的约束条件。

答案 15 :(得分:0)

我遇到过类似的问题。问题在于sectionOfItems部分。 如果节中的节数或行数低于零,则可能不会调用您的cellForRowAtIndexPath。

答案 16 :(得分:0)

对我而言,我的collectionView容器没有translatesAutoresizingMaskIntoConstraints = false

答案 17 :(得分:0)

我在故事板上的收藏视图插座遇到了同样的问题&#34;标准&#34;约束(底部,顶部,前导,尾随固定到内部视图)。

我这样解决了:

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