【问题标题】:Cannot select CollectionView item if the item integrates another CollectionView如果项目集成了另一个 CollectionView,则无法选择 CollectionView 项目
【发布时间】:2020-05-10 14:50:52
【问题描述】:

我的 NSCollectionView 项目集成了另一个 NSCollectionView。一切都很好,但在第一个视图中选择项目时就不行了。

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

这是我迄今为止尝试过的:

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

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

编辑:

所以,如果我点击绿色标签或蓝色部分(这是第一个集合视图项)上的任何地方,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
    }
}

【问题讨论】:

  • 我可以看看你的第二个collectionView的代码吗??
  • @AnjaliShah 我刚刚更新了我的帖子。谢谢!

标签: ios swift macos uicollectionview nscollectionview


【解决方案1】:

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

看看NSCollectionViewDelegatecollectionView(_:shouldSelectItemsAt:)

来自文档:

返回值

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

【讨论】:

  • 不完全是。如果我单击它们的collectionView2,我就无法选择collectionView1 上的任何项目。要选择一个项目,我需要单击 collectionView2 的“周围”。也许我应该在我的帖子中添加一幅画。
  • 我了解到您想点击collectionView1 中某个单元格的任意位置,即使该单元格的内容是另一个collectionView,对吗?如果是这种情况,您是否尝试过禁用 collectionView2 上的选择?请使用您尝试实现此目的的代码更新您的问题,最好是您尝试显示的图片。
  • 是的,您理解正确。我已经用一张图和一些代码更新了我的帖子。我试图在 collectionView2 中将 isSelectable bool 设置为 true 或 false,但没有成功。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-18
  • 2021-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多