我从故事板创建了一个集合视图控制器,并将其自定义类设置为ItemCollectionVC
,其单元格的自定义类为ItemCell
,并将其重用标识符设置为Cell
< / p>
这是我的ItemCollectionVC
课程:
import UIKit
private let reuseIdentifier = "Cell"
class ItemCollectionVC: UICollectionViewController {
var dataSourceItems: [Items] = []
var counterBuildItems: [Items] {
let weaponItemArray = WeaponItems.weaponItems as [Items]
let defenseItemArray = DefenseItems.defenseItems as [Items]
return weaponItemArray + defenseItemArray
}
var freeBuildItems = WeaponItems.weaponItems as [Items]
var captureKrakenItems: [Items] {
let weaponItemArray = WeaponItems.weaponItems as [Items]
let abilityItemArray = AbilityItems.abilityItems as [Items]
return weaponItemArray + abilityItemArray
}
override func viewDidAppear(_ animated: Bool) {
switch self.presentingViewController!.title! {
case "CounterBuildVC":
dataSourceItems = counterBuildItems
case "FreeBuildVC":
dataSourceItems = freeBuildItems
case "CaptureKrakenVC":
dataSourceItems = captureKrakenItems
default:
break
}
}
override func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}
override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return dataSourceItems.count
}
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! ItemCell
cell.cellImage.image = dataSourceItems[indexPath.row].image
print(dataSourceItems.count)
return cell
}
}
当呈现集合视图控制器时,它是空的,可能导致问题的原因是什么?
答案 0 :(得分:3)
如果您非常确定collectionView的dataSource
已连接到viewController(默认情况下应该是这样),那么您应该reloadData()
,因为collectionView从dataSourceItems
读取。要理解这种情况,请在cellForItemAt
中添加一个断点,然后在viewDidAppear
中添加另一个断点,并检查哪个断点是第一个?
override func viewDidAppear(_ animated: Bool) {
switch self.presentingViewController!.title! {
case "CounterBuildVC":
dataSourceItems = counterBuildItems
case "FreeBuildVC":
dataSourceItems = freeBuildItems
case "CaptureKrakenVC":
dataSourceItems = captureKrakenItems
default:
break
}
collectionView.reloadData()
}
希望有所帮助。
答案 1 :(得分:2)
在TableView或CollectionView
中,三个问题中的一个引起了这个问题,几乎每次我都遇到过这个问题:
1)您的ViewController
不是UICollectionView
2)numberOfRows
或numberOfSections
方法返回0
3)由于约束问题,或者heightForCell
方法没有/不正确地实现,单元格的高度为0。
不可能说出这些是你的问题,你总是遇到一些奇怪的事情。在探索不太可能的选项之前,请确保这些都不是您的问题。
答案 2 :(得分:0)
您必须在viewWillAppear中添加代码,然后才能正常运行。 / *
override func viewDidAppear(_ animated: Bool) {
switch self.presentingViewController!.title! {
case "CounterBuildVC":
dataSourceItems = counterBuildItems
case "FreeBuildVC":
dataSourceItems = freeBuildItems
case "CaptureKrakenVC":
dataSourceItems = captureKrakenItems
default:
break
}
}
像这样: -
override func viewWillAppear(_ animated: Bool) {
switch self.presentingViewController!.title! {
case "CounterBuildVC":
dataSourceItems = counterBuildItems
case "FreeBuildVC":
dataSourceItems = freeBuildItems
case "CaptureKrakenVC":
dataSourceItems = captureKrakenItems
default:
break
}
}
* /
答案 3 :(得分:0)
如果使用 故事板
,您可能会容易错过一些东西1)不要忘记,单元格中的内容必须已连接上,下约束和 内容视图必须具有高度,由此单元格将知道要设置单元格的高度。如果没有这些,则单元格高度将为0,并且永远不会调用函数cellForItemAt。
2)如果使用此功能,则可以使用单元格布局来设置动态单元格和单元格的高度:
func collectionView(_ collectionView: UICollectionView,layout collectionViewLayout:
UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) ->
CGSize {return CGSize(width: 20.00, height: 20.00)}
答案 4 :(得分:0)
就我而言,集合视图contentInset出现问题,请尝试在集合视图子类中添加以下代码。
override func layoutSubviews() {
super.layoutSubviews()
self.contentInset = UIEdgeInsetsMake(0, 0, 0, 0)
}
override func reloadData() {
DispatchQueue.main.async {
super.reloadData()
}
}
答案 5 :(得分:0)
检查在collection视图的numberOfItemsInSection方法中是否获得正确的节数。
如果要向集合视图中添加流布局,请删除该流布局,然后检查是否立即显示了集合视图单元格。
如果这样做,只需调整您的集合视图流布局代码即可,就像这样
let _flowLayout = UICollectionViewFlowLayout()
_flowLayout.sectionInset = UIEdgeInsets(top:0, left: 0, bottom: 0, right: 0)
_flowLayout.scrollDirection = .vertical
yourCollectionView.collectionViewLayout = _flowLayout
您可以设置插图以适合您的用途。
答案 6 :(得分:0)
我通过正确初始化 UICollectionView 解决了我的问题,如下所示:
fileprivate let collectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: UICollectionViewFlowLayout.init())