原因
collectionView 管理选中项和自己管理选中项冲突。
collectionView 管理选中项
collectionView 会设置选中项的 cell isSelected=true 。当 cell 重新加载时,即collectionView(UICollectionView, cellForItemAt: IndexPath) -> UICollectionViewCell 返回 cell 对象之后,collectionView 重新设置 cell 的选中状态(猜测)。
自己管理选中项
手动更新选中项的 cell 的视图,比如调用 reloadData() reloadItems(at: [IndexPath]) 。在提供 cell 的回调函数中设置 cell 的选中状态。
冲突
如果同时自己手动更新选中项的 cell 的视图和在 cell 的 isSelected 属性变动时更新视图,如上所述,在 cell 重新加载时,collectionView 会根据内部的记录设置 cell 的 isSelected 属性,如果 collectionView 内部记录里 cell 不是选中状态,则 cell 的视图更新为未被选中状态。