集合视图cellForItemAt indexPath未被调用(Swift)

时间:2016-10-16 07:56:16

标签: ios swift uicollectionview

我从故事板创建了一个集合视图控制器,并将其自定义类设置为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
}
}

当呈现集合视图控制器时,它是空的,可能导致问题的原因是什么?

7 个答案:

答案 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)numberOfRowsnumberOfSections方法返回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())