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

i7uaboj4  于 2023-10-15  发布在  Swift
关注(0)|答案(7)|浏览(204)

我从story board创建了一个集合视图控制器,并将其自定义类设置为ItemCollectionVC,将其单元格的自定义类设置为ItemCell,并将其重用标识符设置为Cell
下面是我的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
}
}

当集合视图控制器出现时,它是空的,是什么导致了这个问题?

bqucvtff

bqucvtff1#

在TableView或CollectionView中,几乎每次我遇到这个问题时,都会有三种情况导致这个问题:
1)您的ViewController不是UICollectionView的数据源
2)numberOfRowsnumberOfSections方法返回0
3)单元格的高度为0,这可能是由于约束问题,或者是由于heightForCell方法未正确实现。
很难说哪一个是你的问题,而且你总是有可能遇到一些奇怪的事情。在探索不太可能的选择之前,确保这些都不是你的问题。

i34xakig

i34xakig2#

如果您非常确定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()
}

希望这对你有帮助。

nkoocmlb

nkoocmlb3#

如果你使用 * 故事板 *,
1)不要忘记,内容在单元格必须有连接顶部,底部约束和内容视图必须有高度,通过这个单元格将知道设置高度的单元格。如果你没有这些,单元格高度将为0,函数cellForItemAt将永远不会被调用。
2)如果使用此函数,则可以使用单元格布局设置动态单元格和单元格高度:

func collectionView(_ collectionView: UICollectionView,layout collectionViewLayout: 
    UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) ->
    CGSize {return CGSize(width: 20.00, height: 20.00)}
r7knjye2

r7knjye24#

我通过正确初始化UICollectionView修复了我的问题,如下所示:

fileprivate let collectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: UICollectionViewFlowLayout.init())
2vuwiymt

2vuwiymt5#

检查在集合视图的numberOfItemsInSection方法中是否获得了正确的节数。
如果要将流布局添加到集合视图,请删除流布局,然后检查集合视图单元格是否立即显示。
如果是这样,只需调整您的集合视图流布局代码,它应该看起来像这样

let _flowLayout = UICollectionViewFlowLayout()
_flowLayout.sectionInset = UIEdgeInsets(top:0, left: 0, bottom: 0, right: 0)
_flowLayout.scrollDirection = .vertical
yourCollectionView.collectionViewLayout = _flowLayout

你可以根据你的需要来调整嵌入物。

ewm0tg9j

ewm0tg9j6#

在我的例子中,集合视图contentInset有一个问题,尝试在你的集合视图子类中添加下面的代码。

override func layoutSubviews() {
    super.layoutSubviews()
    self.contentInset = UIEdgeInsetsMake(0, 0, 0, 0)
}

override func reloadData() {
    DispatchQueue.main.async {
        super.reloadData()
    }
}
jhkqcmku

jhkqcmku7#

你必须在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
}
}
  • /

相关问题