如果项目集成了另一个CollectionView,则无法选择CollectionView项目

我的NSCollectionView项目集成了另一个NSCollectionView。一切都很好,但是在第一个视图中的项目选择上却没有。

当我设置collectionView1.isSelectable = true时,仅当我单击第二个(集成的)collectionView之外的其他位置时,才会调用didSelectItemsAt委托。更清楚地说,如果我单击标签,图像或自定义视图,则可以使用。当我单击第二个集合视图时,不会调用该委托。

这是我到目前为止尝试过的:

  1. collectionView2.isSelectable = true设置为第二个视图。 那没用。
  2. 我关注了this tip。奇怪的是,这也不起作用。我的行为也一样。
  3. 唯一有效的方法是在每个集成的集合视图上添加一个手势识别器。但这太丑了...

我还没有在iOS上使用UICollectionView和单元格选择进行尝试,但是我倾向于认为问题是相同的。

编辑:

如果项目集成了另一个CollectionView,则无法选择CollectionView项目

因此,如果我单击绿色标签或蓝色部分的任何地方(这是第一个集合视图项),则将正确调用didSelectItemsAt委托。 如果我单击橙色的NSView(内部有第二个CollectionView),则不会调用它。

以下是第一个CollectionView的简化代码:

class DashboardVC: NSViewController {

    @IBOutlet weak var collectionView1: NSCollectionView!

    override func viewDidLoad() {
        super.viewDidLoad()

        self.initViews()
    }

    fileprivate func initViews() {        
        let flowLayout = nscollectionviewflowlayout()
        flowLayout.itemSize = NSSize(width: 400.0,height: 380.0)
        flowLayout.sectionInset = NSEdgeInsets(top: 20.0,left: 20.0,bottom: 20.0,right: 20.0)
        flowLayout.minimumInteritemSpacing = 20.0
        flowLayout.minimumLinespacing = 20.0
        self.collectionView1.collectionViewLayout = flowLayout
        self.collectionView1.isSelectable = true
        self.collectionView1.dataSource = self
        self.collectionView1.delegate = self
    }
}

extension DashboardVC: NSCollectionViewDataSource {
    func numberOfSections(in collectionView: NSCollectionView) -> Int {
        return 1
    }

    func collectionView(_ collectionView: NSCollectionView,numberOfItemsInSection section: Int) -> Int {
        return 5
    }

    func collectionView(_ itemForRepresentedObjectAtcollectionView: NSCollectionView,itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem {
        let item = self.collectionView1.makeItem(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "CollectionViewItem"),for: indexPath)
        guard let collectionViewItem = item as? CollectionViewItem else { return item }
        return collectionViewItem
    }
}

extension DashboardVC: NSCollectionViewDelegate {

    func collectionView(_ collectionView: NSCollectionView,didSelectItemsAt indexPaths: Set<IndexPath>) {
        print("I can't make this work!")
    }
}

对于第二个集合视图:

class TabularView: NSView {

    lazy var collectionView2: NSCollectionView = {
        let gridLayout = NSCollectionViewGridLayout()
        gridLayout.maximumNumberOfColumns = self.numberOfColums
        gridLayout.maximumNumberOfRows = self.numberOfRows

        let collectionView = NSCollectionView(frame: .zero)
        collectionView.collectionViewLayout = gridLayout
        collectionView.translatesAutoresizingMaskintoConstraints = false
        collectionView.isSelectable = true //-> does not work :(
        collectionView.dataSource = self
        collectionView.delegate = self
        return collectionView
    }()

override init(frame frameRect: NSRect) {
        super.init(frame: frameRect)
        self.setup()
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
        self.setup()
    }

    private func setup() {
        self.addSubview(self.collectionView)
        NSLayoutConstraint.activate([
            self.topAnchor.constraint(equalTo: self.collectionView.topAnchor),self.bottomAnchor.constraint(equalTo: self.collectionView.bottomAnchor),self.leadingAnchor.constraint(equalTo: self.collectionView.leadingAnchor),self.trailingAnchor.constraint(equalTo: self.collectionView.trailingAnchor),])
    }
}

extension TabularView: NSCollectionViewDataSource {

    func collectionView(_ collectionView: NSCollectionView,numberOfItemsInSection section: Int) -> Int {
        return self.numberOfRows * self.numberOfColums
    }

    func collectionView(_ collectionView: NSCollectionView,itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem {
        let item = collectionView.makeItem(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "TabularCollectionViewItem"),for: indexPath)
        guard let collectionViewItem = item as? TabularCollectionViewItem else { return item }
        return collectionViewItem
    }
}
gr364212028 回答:如果项目集成了另一个CollectionView,则无法选择CollectionView项目

如果我正确理解了您的问题,则您尝试禁用对collectionView1中特定项目的选择,而是让用户选择此单元格中嵌入的collectionView2的项目。

看看NSCollectionViewDelegate的{​​{1}}

从文档中:

返回值

与要选择的项目相对应的NSIndexPath对象的集合。如果您不想选择任何项目,请返回一个空集。

本文链接:https://www.f2er.com/2719484.html

大家都在问