我正在使用这种条件来创建特定的UICollectionViewCells。
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
if(indexPath.item % 3 == 0){//multiples of 3
let cell = myCollectionView.dequeueReusableCell(withReuseIdentifier: "Cell1id", for: indexPath) as! Cell1
cell.backgroundColor = .white
if(cell.wasCreated){
cell.cellLabel.text = "Cell(1) \(indexPath.item) was created before."
}
else{
cell.cellLabel.text = "Creating cell(1) \(indexPath.item) first time."
cell.wasCreated = true
}
return cell
}
else{
let cell = myCollectionView.dequeueReusableCell(withReuseIdentifier: "Cell2id", for: indexPath) as! Cell2
cell.backgroundColor = .gray
if(cell.wasCreated){
cell.cellLabel.text = "Cell(2) \(indexPath.item) was created before."
}
else{
cell.cellLabel.text = "Creating cell(2) \(indexPath.item) first time."
cell.wasCreated = true
}
return cell
}
}//end cellForItemAt
这里'wasCreated'是单元格中的一个变量,我用来检查是否是第一次创建该单元格(如果它是我设置的wasCreated = true
,则应首先进行此操作)时间,每个单元格,但不是。
条件为:如果indexPath.item
是3的倍数,则将单元格1设为双端队列,否则为单元格2。
现在通常情况下,当第一次显示单元格时,将调用该单元格的init()方法,但在这种情况下,不会调用该单元格,并且由于某种原因而使旧单元格出队。
我不知道为什么会这样。
我已经上传了一个示例项目,该项目再现了该问题。这是链接:https://github.com/AfnanAhmadiOSDev/IndexMultiplesTest.git
答案 0 :(得分:4)
您描述的行为是预期的。为了减少内存使用,在收集视图滚动时会重用单元格。
调用dispatch(new ToClients($inputs))
->onQueue('notifications');
// Need to add the timezone here
时,UIKit会检查是否存在一个带有所请求标识符的单元格已移出屏幕,因此有资格重复使用。如果存在,则返回此单元格。在这种情况下,dequeueReusableCell
将不会被调用。如果没有候选单元格,则返回一个新的单元格实例,并调用init
。
运行代码时,您会首先看到正在创建单元,但是在向上和向下滚动以构建足够大的单元重用池之后,将重复使用单元,并且不会创建新单元。
>单元重用独立于先前使用该单元的init
。