collectionView(_:didDeselectItemsAt:) 永远不会被调用

collectionView(_:didDeselectItemsAt:) is never called

出于某种原因,我的 NSCollectionView(使用我编写的自定义布局)在我单击某个项目时调用其委托的 collectionView(_:didSelectItemsAt:) 函数,但不是同一个委托的 collectionView(_:didDeselectItemsAt:)当我点击它时。

这是我的基本设置:

class MyCollectionViewContainer: NSViewController {
    fileprivate lazy var collectionView: NSCollectionView = {
        let collectionView = NSCollectionView()
        collectionView.delegate = self
        collectionView.dataSource = self

        collectionView.collectionViewLayout = self.customLayout
        collectionView.isSelectable = true
        collectionView.allowsEmptySelection = true
        collectionView.allowsMultipleSelection = false
    }()
}

extension MyCollectionViewContainer: NSCollectionViewDelegate {

    func collectionView(_ collectionView: NSCollectionView, didSelectItemsAt indexPaths: Set<IndexPath>) {

        print("Selected", indexPaths)

        // Mutate data to reflect that selection
    }

    func collectionView(_ collectionView: NSCollectionView, didDeselectItemsAt indexPaths: Set<IndexPath>) {
        print("Deselected", indexPaths)
    }
}

"Deselected" 永远不会打印...:/

原来我的布局没有添加任何 NSCollectionElementKindInterItemGapIndicator 类型的补充视图;显然,这是集合视图用来检测您何时单击某个项目的视图。我的快速解决方案是在我的布局中添加一个跨越整个集合视图的巨大视图,并使其 Z 索引低于所有其他项目和补充视图的 Z 索引。

我们需要设置选中的 NSCollectionView 项:

 collectionview.isSelectable = true