我有一个
UITableView
其中每个原型单元都有一个
UICollectionView
在里面。这个集合视图应该是一个图像网格。我对斯威夫特很陌生,在谷歌上搜索了几个小时(读了很多StackOverflow的文章),似乎找不到这个问题的正确答案。
为什么不调用CollectionView cellForitemat?
我看到了我的收藏观
numberOfItemsInSection
方法和集合视图
sizeForItemAt
方法被调用。我一定要把我的
TableViewCell
作为CollectionView的委托和数据源。我在带有outlets的接口生成器中完成了这项工作,在我的自定义tableviewcell的
awakeFromNib
方法
cardImagesCollection.delegate = self
cardImagesCollection.dataSource = self
不管我做什么,我似乎都不能让这叫做它。我确保设置了良好的约束,因为这会在TableViewCells上烧掉我一次。
为了我的生命,我不能让它加载收藏视图。
任何帮助都将不胜感激。
具体来说,我使用的是xcode 9.4.1和swift 4.1。
谢谢
编辑-添加示例代码
家庭视图控制器:uiviewcontroller
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "LatestCardCell", for: indexPath) as! LatestCardsTableViewCell
cell.backgroundColor = UIColor.clear
cell.card = cards[indexPath.row]
return cell
}
LatestCardStableViewCell:uiTableViewCell
@IBOutlet weak var cardImagesCollection: UICollectionView!
var card: Card! {
didSet {
titleLabel.attributedText = FontUtil.attributedCardTitleText(string: card.title)
descriptionLabel.attributedText = FontUtil.attributedCardDescriptionText(string: card.description)
}
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
print("count")
return card.imageUrls.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
print("here")
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "LatestCardsImage", for: indexPath as IndexPath) as! LatestCardImageCell
//let url = card.imageUrls[indexPath.row]
//cell.imageView.image = UIImage(named: "test")
cell.backgroundColor = UIColor.blue
return cell
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: 150, height: 150)
}
最新的CardImageCell:uiCollectionViewCell
@IBOutlet weak var imageView: UIImageView!
编辑2:我尝试过的建议摘要
人们建议在
cellForRowAt
调用我构建集合视图的位置:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "LatestCardCell", for: indexPath) as! LatestCardsTableViewCell
cell.cardImagesCollection.delegate = cell
cell.cardImagesCollection.dataSource = cell
cell.backgroundColor = UIColor.clear
cell.card = cards[indexPath.row]
return cell
}
这并没有改变什么。他们还建议在设置cell.card之后立即在该cellForRowat调用中添加以下内容:
cell.cardImagesCollection.reloadData()
这也没有改变什么。
我在TableViewCell的自定义类中设置了断点并进行了日志记录,我可以看到
项目编号部分
为每个TableViewCell获取一次调用,并返回正确的数字(此数字因TableViewCell而异)。我也明白了
SizeFaritemat公司
被打电话的确切次数
项目编号部分
返回。但是,我没有看到
cellForItemAt
方法被调用。
下面是日志:
numberOfItemsInSection: 6
sizeForItemAt: Section 0 Row 0
sizeForItemAt: Section 0 Row 1
sizeForItemAt: Section 0 Row 2
sizeForItemAt: Section 0 Row 3
sizeForItemAt: Section 0 Row 4
sizeForItemAt: Section 0 Row 5
numberOfItemsInSection: 2
sizeForItemAt: Section 0 Row 0
sizeForItemAt: Section 0 Row 1
numberOfItemsInSection: 4
sizeForItemAt: Section 0 Row 0
sizeForItemAt: Section 0 Row 1
sizeForItemAt: Section 0 Row 2
sizeForItemAt: Section 0 Row 3
有人建议确定
CellForitemat酒店
使用autocomplete而不是复制和粘贴,这是我最初的做法。我还使用以下协议设置了自定义TableViewCell
UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout
它并不抱怨
CellForitemat酒店
方法。我目前在interfacebuilder中设置了委托和数据源,这就是我看到的方法调用。
我试过打电话
reloadData()
在多个地方的collectionview上(第二次设置
cell.card
在我的
牢房
,在我的
didSet
打电话,甚至
从涅盘醒来
方法。什么都不管用。
TableCell呈现的其他方面,但不是此图像集合。我已经在interfacebuilder中硬编码了collectionview单元格的大小,甚至重写了sizeforitemat以始终返回
CGSize(width: 150, height: 150)
,只是为了确保问题不是因为手机太小而看不见。TableView单元格设置为自动高度
latestCardsTableView.rowHeight = UITableViewAutomaticDimension
,我已将长文本添加到标签中,以确保它们的大小随文本自动增长。
有人有其他想法吗?有什么东西我可以从interfacebuilder截图,或者一些我可以编写的快速代码来强制一些自动布局的东西吗?我什么都愿意。
编辑三:一线希望
我发现如果我给uitableviewcell一个显式的大高度,uicollectionview就会出现并调用
CellForitemat酒店
.那么,如何设置约束,以便uiCollectionView强制uiTableViewCell变大
rowHeight = UITableViewAutomaticDimension
放在我的桌面上?