我已经去了这个uicollectionviewcell
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
{
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! PostCell
if let CurrentPost = posts[indexPath.row] as? Post{
//determine which constraint to call
if(CurrentPost.PostText != nil){
if(CurrentPost.PostImage != nil){
cell.postImage.image = CurrentPost.PostImage
cell.cellConstraintsWithImageWithText()
}else{
cell.postImage.image = nil
cell.cellConstraintsWithoutImageWithText()
}
}else{
cell.postImage.image = CurrentPost.PostImage
cell.cellConstraintsWithImageWithoutText()
}
}
return cell
}
我的目标是根据图像和文本的缺失或存在来确定目标函数。现在问题是所有这些函数都被调用,因为有些单元格正在调用图像cellConstraintsWithImageWithText
,而其他单元格则没有让它们如此cellConstraintsWithoutImageWithText
被调用。如何为单个细胞而不是所有细胞调用单个函数?
答案 0 :(得分:0)
这是因为正在重复使用细胞。处理此问题的最简单方法是在视图控制器中存储带有文本的单元格的索引路径。当单元格出列时,只需检查存储的数组和布局中是否存在索引路径。
在ViewController
var cellsWithText: [IndexPath] = []
在cellForItemAt indexPath
...
cell.postImage.image = nil
cell.cellConstraintsWithoutImageWithText()
if !cellsWithText.contains(indexPath) {
cellsWithText.append(indexPath)
}
...
现在开始于cellForItemAt indexPath
if let CurrentPost = posts[indexPath.row] as? Post {
if cellsWithText.contains(indexPath) {
// layout for text
} else {
// layout for image
}
我还注意到你使用posts[indexPath.row]
,但你使用的是collectionView,它没有行,而是item
。这也可能是问题所在。