在viewDidLoad
中获取所使用的数据后调用它。在一些打印调试后,如果没有数据更改,它似乎调用了所有适当的delegeate方法。如果有一些数据更改,则不会调用cellForItemAt
。
重新加载整个部分工作正常。但给我一个不需要的动画。尝试禁用UIView
动画之前,并启用后,重新加载部分,但仍然给我一个小动画。
collectionView.reloadSections(IndexSet(integer: 0))
下面是我目前的情况,当使用reloadData()
UICollectionViewController是TabBarController的一部分。我使用的是自定义UICollectionViewCells。数据从CoreData加载。
第一次打开选项卡时,它工作正常。在另一个选项卡中更新收藏夹项目并返回到此collectionView后,它没有更新。但如果我选择另一个选项卡,并返回到此选项卡,它就会更新。
var favorites = [Item]()
override func viewWillAppear(_ animated: Bool) {
collectionView!.register(UINib.init(nibName: reuseIdentifier, bundle: nil), forCellWithReuseIdentifier: reuseIdentifier)
if let flowLayout = collectionView!.collectionViewLayout as? UICollectionViewFlowLayout {
flowLayout.estimatedItemSize = CGSize(width: 1,height: 1)
}
loadFavorites()
}
func loadFavorites() {
do {
print("Load Favorites")
let fetch: NSFetchRequest = Item.fetchRequest()
let predicate = NSPredicate(format: "favorite == %@", NSNumber(value: true))
fetch.predicate = predicate
favorites = try managedObjectContext.fetch(fetch)
if favorites.count > 0 {
print("Favorites count: \(favorites.count)")
notification?.removeFromSuperview()
} else {
showEmptyFavoritesNotification()
}
print("Reload CollectionView")
collectionView!.reloadData(
} catch {
print("Fetching Sections from Core Data failed")
}
}
override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
print("Get number of section, \(favorites.count)")
if favorites.count > 0 {
return favorites.count
} else {
return 0
}
}
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
print("Get cell")
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! SubMenuCell
let menuItem = favorites[indexPath.row]
cell.title = menuItem.title
cell.subtitle = menuItem.subtitle
return cell
}
控制台打印/日志
启动应用程序,转到没有收藏夹的“收藏视图”选项卡:
Load Favorites
Get number of section, 0
Get number of section, 0
Reload CollectionView
Get number of section, 0
切换选项卡,添加项目对象的收藏夹并将其设置为true,然后返回到CollectionView选项卡:
Load Favorites
Favorites count: 1
Reload CollectionView
Get number of section, 1
The datamodel has 1 item, reloading CollectonView, cellForRowAtIndex not called?
选择另一个选项卡(随机选择),然后返回“集合视图”选项卡,不更改任何数据。
Load Favorites
Favorites count: 1
Reload CollectionView
Get number of section, 1
Get cell
现在我的项目出现在列表中。你可以从获取单元格中看到cellForItemAt
也被调用了。在这最后两次日志记录之间没有任何变化,只是在标签上单击了一次后退/第四。
忘了提一下,但是这个代码在模拟器中工作得很好。在读取设备上,它不会给我任何错误,只是不显示单元格(或调用cellForItemAt
)
8条答案
按热度按时间hmtdttj41#
经过一些更多的调试,我得到了一个错误时,项目得到减少(而不是增加像我已经尝试了以上)。
这导致mediOS 10 bug: UICollectionView received layout attributes for a cell with an index path that does not exist
"这解决了我的问题"
我正在使用自动调整单元格大小,但我想这并不能解释为什么没有调用
cellForItemAt
。stszievb2#
在我的例子中,我的集合视图是在堆栈视图中,我没有做任何约束,当我添加必要的约束时,它就工作了。
只需检查集合视图的约束即可。
yiytaume3#
好吧,也许我可以帮助别人=)
我这样做:
1.从API加载数据
1.然后在加载数据后调用DispatchQueue.main.async,如下所示
1.在self.pointNewsdidSet中,我尝试执行collectionView.reloadData(),但只有在didSet中调用DispatchQueue.main.async时,它才能工作
unhi4e5o4#
这是帮助我解决这类问题的代码。
afdcj2ne5#
发布代码。
一种可能性是,您正在使用'URLSession,并试图告诉您的集合视图从它的委托方法/完成闭包进行更新,而没有意识到该代码是在后台线程上运行的,因此您不能从后台线程进行UI调用。
ygya80vv6#
我遇到了同样的问题与自我调整单元格和上述解决方案的工作,以及,但收集视图滚动位置重置,并前往顶部。下面的解决方案有助于保留您的滚动位置。
mtb9vblg7#
我也面临着这样的问题,所以最后我能够解决使用这行代码
[自身.集合视图重新加载数据];
NSIndexPath索引路径,索引路径为:0];
xmjla07d8#
我遇到了同样的问题。我正在根据内容更新UICollectionView的高度,当您将集合视图的高度设置为零时,reloadData()停止工作。在设置最小高度后,reloadData()按预期工作。