我正在尝试为UICollectionView实现多重选择。委托函数didSelectItemAt被调用,但didDeselectItemAt从未被调用,我不知道为什么?我什至不知道它是如何工作的。如果我单击一个单元格,则会调用didSelectItemAt。因此,如果我再次单击同一单元格,是否应该调用didDeselectItemAt?
我的UIViewController继承并符合以下所有条件:UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout
viewdidLoad():
collectionView.allowsSelection = true
collectionView.allowsMultipleSelection = true
代理功能:
override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
print("didSelectItemAt")
}
func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
print("DESELECT")
}
答案 0 :(得分:1)
请在Github上查看this公开问题。
可能是在包含集合视图的同一层次结构中的视图上具有轻击手势识别器。删除点击手势,看看是否可行。这恰好是我的问题。
let tap = UITapGestureRecognizer(...) // your tap gesture recognizer
view.addGestureRecognizer(tap) // what you already have
tap.cancelsTouchesInView = false
答案 1 :(得分:0)
它是这样的:
如果collectionView.allowsMultipleSelection = false
//默认,那么您必须点击另一个单元格才能取消选择上一个单元格。
如果collectionView.allowsMultipleSelection = true
//仅点击相同单元格会取消选择委托方法
答案 2 :(得分:0)
我猜您的代码与您向我们展示的代码不同,并且在您的真实代码中,您没有为didDeselect
给出正确的签名。这就是为什么。仔细查看显示的代码:
override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
print("didSelectItemAt")
}
func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
print("DESELECT")
}
现在问自己:即使您忘记说func
,编译器为何还允许第二个override
站立?我猜是因为它不是替代。签名有问题,所以它只是一个没有意义的函数,不符合UICollectionViewDelegate。
尝试使用代码完成功能重新输入此功能。如果一切顺利,它将被覆盖并且开始工作。
为了更精确地说明:可以编译,但是永远不会调用第二种方法:
class CV : UICollectionViewController {
override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
print("didSelectItemAt")
}
func colectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
print("DESELECT")
}
}
但这无法编译,因为签名正确,但是我们忘记了override
:
class CV : UICollectionViewController {
override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
print("didSelectItemAt")
}
func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
print("DESELECT")
}
}
但是在第二个例子中,如果我们做说override
,它将编译并起作用。
答案 3 :(得分:0)
我不确定这是否最近更改,但是在iOS13中,似乎仅在退出单元格时指定仅选择一个收集视图单元格不足以让收集视图取消选择该单元格。您还需要也手动告诉收集视图以选择单元格。
ArrayList
之所以知道这一点,是因为我能够选择和取消选择单元格,但无法取消选择最初选择的单元格。