UICollectionView的cellForItemAtIndexPath没有被调用

只有我第二次使用UICollectionView的,也许我咬了更多比我可以咀嚼,但不过:

我正在实现一个UICollectionView(myCollectionView),它使用自定义UICollectionViewCell我已经subclassed。 子类(FullReceiptCell)包含UITableView的和是视图控制器的大小。 我试图让FullReceiptCells之间的水平滚动。

包含myCollectionView的子类UICollectionViewController被推送到导航控制器堆栈。 目前,启用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]; 

任何线索,为什么它不被称为?

对于那些稍后在这里绊倒的人……原因是:

 - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 

没有被调用是因为collectionViewFlowLayout的高度的itemSize太大。

 [self.myCollectionViewFlowLayout setItemSize:CGSizeMake(320, 548)]; 

如果我改变高度为410,它将执行cellForItemAtIndexPath。

在我的情况,这是因为我的布局类错误地从UICollectionViewLayout而不是UICollectionViewFlowLayout

如果您不提供内容大小信息到集合视图,cellForItemAtIndexPath将不会被调用。

  1. 如果您正在使用stream布局 :您需要正确设置项目大小。
  2. 如果您从UICollectionViewLayout获得了自定义布局子类 :确保从collectionViewContentSize方法返回适当的大小。

在后者的情况下,你也会观察到你的layoutAttributesForElementsRect也没有被调用。 原因是你没有指定什么是你的内容大小,默认情况下,大小将是CGSizeZero。 这基本上告诉收集视图,你没有任何内容画,所以它不会问你的属性或单元格。

所以,只需重写collectionViewContentSize并提供适当的大小,它应该可以解决您的问题。

也许我只是忽略它,但似乎你想念你的委托和数据源。 在你的头文件中,确保你已经添加了这些:

 <UICollectionViewDelegate, UICollectionViewDataSource> 

并在你的viewDidLoad方法中添加这个:

 self.myCollectionView.delegate = self; self.myCollectionView.dataSource = self; 

此外,如果您通过.xib加载它,请确保您已将IBOutlet连接到UICollectionView。

对于更复杂的视图层次,请检查这个博客 。 它拯救了我的生命!

 self.automaticallyAdjustsScrollViewInsets = NO; 

在我的情况下,我曾经非常愚蠢地忘记做的是实现UICollectionViewDataSource协议方法numberOfItemsInSection ,所以这是另一件要检查。

在我的情况下,改变UINavigationBar的半透明到NO解决了这个问题。

这是发生在物品高度== 0通过修复cellForItem方法被调用。

确保 – (NSInteger)collectionView:numberOfItemsInSection:返回一个肯定的(读取,大于零)值。 这可能是放置[self.collectionView reloadData]; 在完成处理程序。

十分钟前我也遇到过这个问题,我犯了一个愚蠢的错误。

我的意图是使用UICollectionViewFlowLayout,

但是由于错误,我使用了UICollectionViewLayout。

在Xcode 7.0.1中,当我们复制另一个项目的故事板和附带代码时,我们遇到了这个问题。 集合视图在故事板中设置了自定义stream布局。 解决scheme是:

  • 删除IB中的stream布局
  • 编译/运行应用程序
  • 设置stream量布局

现在它工作:)

我忘了在集合视图中将autoresizing mask设置为false:

 collectionView.translatesAutoresizingMaskIntoConstraints = false 

如果你的类是子类forms的UICollectionviewController,你正在以编程方式创buildcollectionView的使用

 let layout = UICollectionViewFlowLayout() layout.scrollDirection = .Vertical layout.itemSize = CGSizeMake(50, 50) collectionView?.setCollectionViewLayout(layout, animated: false) 

同样发生在我身上。 我有2 UICollectionViews,我删除了一次,因为我不需要。 之后,我意识到CellForItemAtIndexPath没有被调用,但其他所需的方法。 我尝试了上面的所有内容,但后来我做了标准魔术。 从故事板中删除收集视图,并再次添加。 然后开始工作。 不知道为什么,我没有任何解释,但可能有一些连接问题。

确保numberOfSectionsInCollectionView返回一个正整数。

集合中至less有一个部分。

如果使用集合视图协议,则必须将CollectionViewDataSourceCollectionViewDataSource协议连接到ViewController。 界面建设者的网点

我遇到过同样的问题。 用各种技术尝试了几个小时之后,对我来说有效的是 – 重新启动Xcode。 我的cellforitematindexpath被称为和细胞正确填充图像

我沉迷了一段时间,这个问题来自一个从一个故事板加载的一个Contained视图控制器中的一个CollectionView。 我最终删除了包含的视图控制器,并在故事板中重新创build,这似乎摆脱了这个问题。 我的猜测是发生了某种故事板腐败。

此外,请确保在集合视图正在使用animation更新(插入,删除,更新或执行批次更新)时,不会调用reloadData。

在我的情况下,设置collectionView.prefetchingEnabled = NO; 解决了我的问题。 只适用于iOS 10。

对我来说,我通过自动布局更新self.view(collectionView的超级视图)的高度,并在此之后必须调用layoutIfNeeded

 [self.view mas_updateConstraints:^(MASConstraintMaker *make) { make.height.equalTo(@(height)); }]; [self.view layoutIfNeeded]; 

刚刚解决了这个问题,对于某种特定的情况。

在我的情况下,我手动初始化父ViewController中的UICollectionViewController,然后添加UICollectionViewController的视图作为子视图。

我通过在父视图的viewDidAppear中的collectionView上调用“setNeedsLayout”和/或“setNeedsDisplay”来解决这个问题:

 - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [_collection.view setNeedsLayout]; [_collection.view setNeedsDisplay]; } 

我的问题是我在同一视图中有两个集合视图,并且都共享一个计算的UICollectionViewFlowLayout实例。 一旦我创build了相同的stream布局的单独的实例,它工作正常。

在使用UICollectionViewDelegateFlowLayout要小心这个函数返回的内容。 widthheight都应该大于0 。 我用window作为框架引用,但由于复杂的视图层次窗口在运行时nil 。 如果您需要根据屏幕宽度调整元素的宽度,请使用UIScreen.main.bounds

 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {} 

这可能是相关的布局问题。 如果存在,请检查控制台的布局警告。

在自定义单元格的layoutSubViews()中为我设置collectionView框架:

 override func layoutSubviews() { super.layoutSubviews() let frame = self.contentView.bounds self.CollectionView.frame = frame }