Swift UITableView/UICollectionVIew将数据传递到CellForRow中的单元格时返回零
我正在尝试将结构从集合视图传递到cellForRowAt方法中的单元格。我也尝试过使用表视图,但它产生了相同的错误 集合视图类代码:Swift UITableView/UICollectionVIew将数据传递到CellForRow中的单元格时返回零,swift,xcode,uitableview,Swift,Xcode,Uitableview,我正在尝试将结构从集合视图传递到cellForRowAt方法中的单元格。我也尝试过使用表视图,但它产生了相同的错误 集合视图类代码: class PaintingListCollectionViewController: UICollectionViewController { var allPaintings: CategorySection! override func viewDidLoad() { super.viewDidLoad()
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类中printingpaintingData
仍然返回零。使用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
抱歉,我没有正确更新帖子。我正在使用这个项目。这个问题仍然存在。