我在IB中构建了collectionViewCell
。设置了所有约束,但是当集合视图加载单元格时,它们的尺寸默认为50x50。
这是我的手机:
另一个有趣的时刻,如果我为集合视图设置布局属性,如下所示:
layout.estimatedItemSize = UICollectionViewFlowLayoutAutomaticSize
它正确地布置了单元格,但仅在重新加载后。
正如您在向左滑动后看不到任何内容,但在拉出和刷新单元格出现后。
滑动和加载数据后为什么单元格不显示?
我发现没有调用像numberOfItemsInSection
,willDisplay
,cellForItemAt
这样的数据源函数。它们在刷新后被称为一个。
这两个屏幕(左和右)是水平收集视图的单元格。在第二个单元格中,我有另一个集合视图 在第二个单元格中,我像这样实例化集合:
lazy var collectionView: UICollectionView = {
let layout = UICollectionViewFlowLayout()
layout.estimatedItemSize = UICollectionViewFlowLayoutAutomaticSize
let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
collectionView.backgroundColor = UIColor.clear
collectionView.alwaysBounceVertical = true
return collectionView
}()
...
override func setupViews() {
super.setupViews()
let nib = UINib(nibName: String(describing: WorkoutSectionCollectionViewCell.self), bundle: nil)
collectionView.register(nib, forCellWithReuseIdentifier: String(describing: WorkoutSectionCollectionViewCell.self))
collectionView.dataSource = self
collectionView.delegate = self
fetchMyWorkouts()
collectionView.reloadData()
}
fetchMyWorkouts
函数通过REST Api从后端检索数据:
func fetchMyWorkouts() {
self.activityIndicatorView.startAnimating()
Synchronizer.sharedInstance.syncNewWorkout { (_, error) in
if error != nil {
let message = Murmur(title: error!.localizedDescription, backgroundColor: Colors.colorWhite, titleColor: Colors.colorCadmiumOrange, font: UIFont(name: "OpenSans", size: 10)!, action: nil)
Whisper.show(whistle: message, action: .show(5))
} else {
RestApi.sharedInstance.fetchData(withRequest: .getWorkouts, entityNamed: .workout) { _ in
DispatchQueue(label: "", qos: .background).async {
let requestMyWorkouts = NSFetchRequest<NSFetchRequestResult>(entityName: "Workout")
requestMyWorkouts.predicate = NSPredicate(format: "createdBy == %@", USERID)
do {
self.myWorkouts = try dataStack.mainContext.fetch(requestMyWorkouts) as! [Workout]
} catch {
fatalError("Failed to fetch workouts: \(error)")
}
DispatchQueue.main.async(execute: {
self.placeholderStackView.isHidden = (self.myWorkouts.count == 0) ? false : true
self.collectionView.reloadData()
self.activityIndicatorView.stopAnimating()
})
}
}
}
}
}
更新:这是与fetchMyWorkouts()
功能相关联的特定问题。当集合视图试图获取单元格的数据时,它没有完成并且数据源为空。结果 - 什么都没有出现。
答案 0 :(得分:0)
在您从网络服务或您认为最适合的任何地方获取数据后,请务必在viewWillAppear或类似内容上调用reloadData。
来自Apple docs - 在UICollectionView或UITableView上的reloadData:
当您需要重新加载集合视图中的所有项目时,请谨慎使用此方法。这会导致集合视图丢弃任何当前可见的项目(包括占位符),并根据数据源对象的当前状态重新创建项目。
所以它基本上调用那些协议函数。