在 numberOfItemsInSection 返回非零项目编号后未调用 UICollectionView cellForItemAtIndexPath

Posted

技术标签:

【中文标题】在 numberOfItemsInSection 返回非零项目编号后未调用 UICollectionView cellForItemAtIndexPath【英文标题】:UICollectionView cellForItemAtIndexPath not called after numberOfItemsInSection returns nonzero item number 【发布时间】:2015-09-10 23:51:25 【问题描述】:

numberOfItemsInSection 被调用并返回一个非零数字之后,cellForItemAtIndexPath 不会被调用吗?来自完成块的reloadData 会影响这个吗?我遇到了一个问题,我试图通过UIAlertController 删除一个单元格,并且 UI 看起来很棒,但是当我在 UI 动画完成后转到reloadData 时,numberOfItemsInSection 被正确地调用了正确的号码元素数(之前的元素数减 1),但 cellForItemAtIndexPath 没有被调用,所以我的单元格不会被重新加载。关于为什么会发生这种情况的任何想法?

这是在Swift 1.2XCode 6.4 上,我们将不胜感激任何帮助

只是为了提供更多信息,我用来删除单元格的方法看起来有点像:

self.collectionView.performBatchUpdates(
    let indexPathCellToDelete = self.indexPath(feedCell)
    self.collectionView.deleteItemsAtIndexPaths([indexPathCellToDelete])
, completion:nil)

在完成块中进行第二次重新加载会改变什么吗?

【问题讨论】:

您是否正确连接了委托和数据源? 当然,在我删除某些内容之前,所有数据都正常显示,只有在删除集合视图中的项目后,该方法才不再被调用 尝试在主线程上重新加载。 试过了,没用。所以这不是主队列问题 可以手动尝试拨打cellForItemAtIndexPath吗? 【参考方案1】:

原来performBatchUpdates,根据UICollectionView Performing Updates using performBatchUpdates需要在我的数据源更改完成后调用。但是,问题是,我从数据源中删除项目的方法本身会重新加载集合视图,因此不需要发生额外的重新加载,这似乎是导致问题的原因。我最初在performBatchUpdates 的完成块中调用了我的数据源删除方法,但是将其移到上面并重新加载整个集合视图似乎已经解决了这个问题。在我的情况下,这似乎是一个奇怪的竞争条件,同时发生了多个重新加载,cellForItemAtIndexPath 不喜欢这样。

【讨论】:

以上是关于在 numberOfItemsInSection 返回非零项目编号后未调用 UICollectionView cellForItemAtIndexPath的主要内容,如果未能解决你的问题,请参考以下文章

numberOfItemsInSection 的逻辑问题:

在 numberOfItemsInSection 返回非零项目编号后未调用 UICollectionView cellForItemAtIndexPath

[UIView collectionView:numberOfItemsInSection:]: 无法识别的选择器发送到实例

如何在 numberofitemsinsection 中管理两个不同的单元格

UITableviewCell 中的 collectionView numberOfItemsInSection

重新加载集合视图数据时对成员 'collectionView(_:numberOfItemsInSection:)' 的模糊引用