我有一个UITableView
,每个原型单元中都有一个UICollectionView
。该集合视图应该是图像网格。我是Swift的新手,已经在Google上搜索了几个小时(并阅读了很多StackOverflow文章),而且似乎无法找到该问题的正确答案。
为什么不调用collectionView cellForItemAt?
我看到我的collectionView numberOfItemsInSection
方法和collectionView sizeForItemAt
方法被调用。我已经确保将TableViewCell
分配为collectionView的委托和dataSource。我既在带插座的界面生成器中进行此操作,又在自定义TableViewCell的awakeFromNib
方法中使用
cardImagesCollection.delegate = self
cardImagesCollection.dataSource = self
无论我做什么,我似乎都无法称呼它。我确保设置了良好的约束,因为那一次在tableViewCells上把我烧死了。
为了我的生命,我无法加载它来加载collectionView。
任何帮助将不胜感激。
具体地说,我正在使用Xcode 9.4.1和Swift 4.1。
谢谢
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
}
@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)
}
@IBOutlet weak var imageView: UIImageView!
人们建议在我创建CollectionView的cellForRowAt
调用中为CollectionView设置数据源和委托:
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的自定义类中放置了断点并进行了记录,我发现numberOfItemsInSection
每个TableViewCell都会调用一次,并且返回正确的数字(此数字在TableViewCell之间有所不同)。然后,我还看到sizeForItemAt
被称为numberOfItemsInSection
返回的确切时间。但是,我没有看到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
,这是我首先要做的。我还使用以下协议UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout
设置了自定义TableViewCell,它没有抱怨缺少cellForItemAt
方法。我目前在InterfaceBuilder中设置了委托和数据源,这就是我所看到的方法调用的原因。
我尝试在多个位置上对collectionView调用reloadData()
(第二个步骤是在cell.card
,cellForRowAt
调用中设置didSet
,甚至在自定义TableViewCell中的awakeFromNib
方法无效。
TableCell的其他方面呈现,但此图像集合不呈现。我已经在InterfaceBuilder中为CollectionView单元格进行了硬编码,甚至覆盖了sizeForItemAt以始终返回CGSize(width: 150, height: 150)
,只是为了确保问题所在的单元格太小而看不到。 tableView单元格使用latestCardsTableView.rowHeight = UITableViewAutomaticDimension
设置为自动高度,并且我在标签中添加了长文本,以确保它们的大小会随着文本的自动增长。
还有其他想法吗?是否可以通过InterfaceBuilder截屏,或者可以编写一些Swift代码来强制执行某些AutoLayout功能?我对任何事物都开放。
我发现,如果我给我的UITableViewCell一个明显的大高度,则UICollectionView会显示出来并调用cellForItemAt
。因此,假设我在TableView上设置了rowHeight = UITableViewAutomaticDimension
,如何设置约束以使UICollectionView强制UITableViewCell更大?
答案 0 :(得分:0)
也许您可以执行以下操作, 在您的LatestCardsTableViewCell类中编写一个方法,
func configureCell() {
cardImagesCollection.reloadData()
}
并在HomeViewController的cellForRowAtIndexPath中调用此方法,如下所示,
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]
cell. configureCell()
return cell
}