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

Bri*_*ure 4 ios uicollectionview swift

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

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

dyl*_*ion 8

几乎每次我在 TableView 或 TableView 中遇到它时,都会导致此问题的三个原因之一CollectionView

1) 你ViewController不是你的数据源UICollectionView

2) numberOfRowsornumberOfSections方法返回 0

3) 单元格的高度为 0,要么是由于约束问题,要么是由于heightForCell未/未正确实施的方法。

不可能说其中哪一个是您的问题,而且您总是可能遇到一些奇怪的事情。在探索不太可能的选择之前,请确保这些都不是您的问题。


Ahm*_*d F 4

如果您非常确定dataSourcecollectionView 的 已连接到 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()
}
Run Code Online (Sandbox Code Playgroud)

希望有帮助。

  • 在添加无意义的注释之前,正如我在答案中提到的,添加两个断点并检查会发生什么。打起精神来 :) (2认同)