Невозможно выбрать элемент CollectionView, если элемент объединяет другой CollectionView - PullRequest
0 голосов
/ 24 января 2020

Мой элемент NSCollectionView объединяет другой NSCollectionView. Все отлично работает, но не в том, что касается выбора элементов в первом представлении.

Когда я устанавливаю collectionView1.isSelectable = true, делегат didSelectItemsAt вызывается, только если я щелкаю где-то еще, чем второй (интегрированный) collectionView. Чтобы быть более понятным, если я нажимаю на ярлык, изображение или пользовательский вид: это работает. Как только я нажимаю на второе представление коллекции, делегат не вызывается.

Вот что я пробовал до сих пор:

  1. Установка collectionView2.isSelectable = true для второго представления. Это не сработало.
  2. Я следовал этому совету . Любопытно, что это тоже не сработало. У меня такое же поведение.
  3. Единственное, что работает, - это добавление распознавателя жестов в каждое интегрированное представление коллекции. Но это так ужасно ...

Я еще не пробовал iOS с UICollectionView и выбором ячеек, но я склонен думать, что проблема та же.

РЕДАКТИРОВАТЬ:

enter image description here

Итак, если я нажму на зеленую метку или везде на синей части (которая является первой элемент представления коллекции), делегат 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
    }
}

1 Ответ

0 голосов
/ 24 января 2020

Если я правильно понимаю вашу проблему, вы пытаетесь отключить выделение для определенного элемента c в collectionView1 и вместо этого пользователь выбирает элементы collectionView2, встроенные в эту ячейку.

Взгляните на NSCollectionViewDelegate collectionView(_:shouldSelectItemsAt:)

Из документации:

Возвращаемое значение

Набор NSIndexPath объекты, соответствующие элементам, которые вы хотите выбрать. Если вы не хотите, чтобы какие-либо элементы были выделены, верните пустой набор.

...