我模仿地呈现viewcontroller
,其中viewcollection
根据传递在segue上的数据格式化为不同背景颜色的“预选”单元格。
当我点击其中一个“预选”单元格时,需要两次点击才能触发didDeselectItemAt
委托方法。我理解为什么在调试时会发生这种情况,其中虽然不同颜色的单元格不一定在选定状态下被识别。 有没有办法首先为“预选”单元格触发didDeselectItemAt
?
我已尝试在委托方法cellForItemAt
中合并,作为更改单元格背景颜色的条件语句的一部分,设置cell.isSelected = true
。类似地,在同一个委托方法中,我也尝试调用一个函数,该函数将使用这些“预先选择”单元格的indexPaths调用委托方法didSelectItemAt
。两者都产生了相同的结果。
以下是(缩写)相关代码片段:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath as IndexPath) as! ExampleCollectionViewCell
if preselectedDataPoints { cell.backgroundColor = blue }
else { cell.backgroundColor = white }
return cell
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let cell = collectionView.cellForItem(at: indexPath)
cell?.backgroundColor = blue
preselectedDataPoints.append(newDataPoint)
}
func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
let cell = collectionView.cellForItem(at: indexPath)
cell?.backgroundColor = white
preselectedDataPoints.remove(at: existingDataPoint)
}
答案 0 :(得分:2)
如果预先选择了单元格,则以编程方式在didSelectItem中调用collectionView.deselectItem(at: indexPath, animated: true)
。
Refrer代码
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
if preselectedDataPoints {
collectionView.deselectItem(at: indexPath, animated: true)
}else{
let cell = collectionView.cellForItem(at: indexPath)
cell?.backgroundColor = blue
preselectedDataPoints.append(newDataPoint)
}
}
或
直接调用你需要在deSelect方法中执行的代码
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
if preselectedDataPoints {
let cell = collectionView.cellForItem(at: indexPath)
cell?.backgroundColor = white
preselectedDataPoints.remove(at: existingDataPoint)
}else{
let cell = collectionView.cellForItem(at: indexPath)
cell?.backgroundColor = blue
preselectedDataPoints.append(newDataPoint)
}
}