Swift UITableView/UICollectionVIew将数据传递到CellForRow中的单元格时返回零

Swift UITableView/UICollectionVIew将数据传递到CellForRow中的单元格时返回零,swift,xcode,uitableview,Swift,Xcode,Uitableview,我正在尝试将结构从集合视图传递到cellForRowAt方法中的单元格。我也尝试过使用表视图,但它产生了相同的错误 集合视图类代码: class PaintingListCollectionViewController: UICollectionViewController { var allPaintings: CategorySection! override func viewDidLoad() { super.viewDidLoad()

我正在尝试将结构从集合视图传递到cellForRowAt方法中的单元格。我也尝试过使用表视图,但它产生了相同的错误

集合视图类代码:

class PaintingListCollectionViewController: UICollectionViewController {
    
    var allPaintings: CategorySection!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        ...
    }
    
    // MARK: UICollectionViewDataSource
    override func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }
    
    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return allPaintings.paintings.count
    }
    
    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "paintingCell", for: indexPath) as? PaintingCollectionViewCell
        
        // works perfectly
        cell?.paintingTitleLabel.text = allPaintings.paintings[indexPath.item].title
        cell?.paintingImageView.image = UIImage(named: allPaintings.paintings[indexPath.item].title)
        
        cell?.paintingData = allPaintings!.paintings[indexPath.item]

        // prints out two valid data
        print(cell?.paintingData, allPaintings!.paintings[indexPath.item])
    
        return cell!
    }

}
class PaintingTableViewCell: UITableViewCell {
    @IBOutlet weak var paintingImageView: UIImageView!
    @IBOutlet weak var paintingNameLabel: UILabel!
    var paintingData: Painting?

    override func awakeFromNib() {
        super.awakeFromNib()

        // always returns nil, despite printing out the exact same thing in cellForItemAt returns a valid result. 
        print(paintingData)
    }

}
单元类别代码:

class PaintingListCollectionViewController: UICollectionViewController {
    
    var allPaintings: CategorySection!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        ...
    }
    
    // MARK: UICollectionViewDataSource
    override func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }
    
    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return allPaintings.paintings.count
    }
    
    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "paintingCell", for: indexPath) as? PaintingCollectionViewCell
        
        // works perfectly
        cell?.paintingTitleLabel.text = allPaintings.paintings[indexPath.item].title
        cell?.paintingImageView.image = UIImage(named: allPaintings.paintings[indexPath.item].title)
        
        cell?.paintingData = allPaintings!.paintings[indexPath.item]

        // prints out two valid data
        print(cell?.paintingData, allPaintings!.paintings[indexPath.item])
    
        return cell!
    }

}
class PaintingTableViewCell: UITableViewCell {
    @IBOutlet weak var paintingImageView: UIImageView!
    @IBOutlet weak var paintingNameLabel: UILabel!
    var paintingData: Painting?

    override func awakeFromNib() {
        super.awakeFromNib()

        // always returns nil, despite printing out the exact same thing in cellForItemAt returns a valid result. 
        print(paintingData)
    }

}
我正在使用以下结构:

struct CategorySection {
    var title: String
    var image: String
    var color: UIColor
    var paintings: [Painting]
}

struct Painting {
    var title: String
    var size: String
    var year: String
    var text: String
}
我发现,如果我将数据直接传递给单元格的@IBOutlet UI属性,它就会工作。但当我将数据传递给UITableViewCell类中的可选变量时,结果总是为零。如果我也使用UITableView,则会出现此问题。另外,我需要提到
var allpaints:CategorySection也使用与此处所述完全相同的方式从另一个表视图控制器传递。因此,这里发生的数据传递已经是该链的第二次

这是一个非常奇怪的错误。。。如果有人能帮助我,我将非常感激


已编辑:原始问题描述使用UITable视图而不是collection视图,数据源使用sections而不是row。我做这些更改是为了调试。

如果在awakeFromNib和cellForRowAt中的print语句上设置断点,您将看到在将数据放入collectionViewCell之前调用了awakeFromNib。事实上,它是由
collectionView.dequeueReusableCell()
调用的。您想使用UICollectionViewCell.didMoveToSuperview()吗

我为cellForRowAt添加了一个错误检查保护,如果由于某种原因未能创建单元格,函数的最后一行将崩溃
返回单元格

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "paintingCell", for: indexPath) as? PaintingCollectionViewCell else {
        fatalError("unable to dequeue cell")
    }
    
    // works perfectly
    cell.paintingNameLabel?.text = allPaintings.paintings[indexPath.item].title
    cell.paintingImageView.image = UIImage(named: allPaintings.paintings[indexPath.item].title)
    
    cell.paintingData = allPaintings!.paintings[indexPath.item]
    
    // prints out two valid data
    print("cellForItemAt ",cell.paintingData ?? "nothing to see here", allPaintings!.paintings[indexPath.item])
    
    return cell
}

“paintingData”是什么样子的?您是否有意用相同的数据加载节中的每个单元格?为什么要使用indexPath.section?我刚刚编辑了我的文章以了解更多细节。我使用节而不是行进行样式设置。我认为在传递数据时没有任何区别。将节和行混淆在一起在逻辑上是不正确的。您的数据源设置不正确。对于单元格,我将打开所有选项,从单元格开始,然后继续查找为什么绘图保持为零。为了“更好的逻辑”,我切换到行而不是节print(cell?.paintingData,allpaints!.paints[indexPath.row])
现在会生成两个有效数据,但在cell类中printing
paintingData
仍然返回零。使用row而不是section将始终将数据的第一部分传递给单元格……这不是我想要的。尽管cellForRowAt中的
print(cell?.paintingData,allpaints!.paints[indexPath.section])
现在打印两个有效数据,
print(paintingData)
中的
awakeFromNib()
中的
PaintingTableViewCell:UITableViewCell
仍然返回零…对。我在那里遇到了麻烦。您需要同时使用indexPath.section和indexPath.row在所有绘画中找到正确的项目。如果所有分区的行数相同,则可以使用
realoindex=indexath.section*numberOfItemsPerSection+indexPath.row
访问它们。然后参考
allpaints!。绘画[realIndex]
否则绘画需要是二维数组,因此
绘画[indexPath.section][indexPath.row]
返回您要查找的内容我切换到集合视图,并使用集合视图中与行“项”等价的内容。这个bug仍然存在。现在我有很多项目,只有一个部分。但是,cellForItemAt中的print(cell?.paintingData,allpaints!.paints[indexPath.row])现在生成两个有效数据,但在cell类中打印paintingData仍然返回nil。有关详细信息,请参阅已编辑的问题描述。对于集合视图,您使用的是
indexath.item
,因此您应该将所有出现的
indexath.row
替换为
indexath.item
抱歉,我没有正确更新帖子。我正在使用这个项目。这个问题仍然存在。