Методы NSCollectionViewDelegate не вызываются

У меня есть NSCollectionView, где я хотел бы показать 6 цветных ячеек, представляющих небольшую цветовую палитру. Я установил его, чтобы иметь делегата. Я зарегистрировал типы, которые он может перетаскивать, но методы делегата для него не вызываются.

Вот класс, который является моим источником данных и делегатом:

class TileView: NSView, NSCollectionViewDataSource, NSCollectionViewDelegate {
    var currentPalette: ColorPalette = .grayscale
    @IBOutlet var colorPalettePanel: NSPanel? = nil
    @IBOutlet var colorCollection: NSCollectionView? = nil

    override func awakeFromNib() {
        colorCollection?.registerForDraggedTypes([NSPasteboard.PasteboardType.color])
        colorCollection?.setDraggingSourceOperationMask(NSDragOperation.move, forLocal: true)
    }

    override func draw(_ dirtyRect: NSRect) {
        let context = NSGraphicsContext.current?.cgContext
        draw(into: context)
    }

    // MARK: - Collection View Data Source Methods
    func collectionView(_ collectionView: NSCollectionView, numberOfItemsInSection section: Int) -> Int {
        return 6
    }

    func collectionView(_ collectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem {
        let colorIndex = indexPath.last
        let result = ColorCollectionViewItem(nibName: "ColorCollectionViewItem", bundle: Bundle.main, colorIndex: colorIndex!)
        let color = gCustomPalette6 [ colorIndex! ]
        result.colorWell?.color = NSColor(cgColor: color)!
        return result
    }
    
    // MARK: - Collection View Delegate Methods
    func collectionView(_ collectionView: NSCollectionView, validateDrop draggingInfo: NSDraggingInfo, proposedIndex proposedDropIndex: UnsafeMutablePointer<Int>, dropOperation proposedDropOperation: UnsafeMutablePointer<NSCollectionView.DropOperation>) -> NSDragOperation {
        print("dragging Info = \(draggingInfo), proposed drop operation = \(proposedDropOperation)")
        return NSDragOperation.move
    }

    func collectionView(_ collectionView: NSCollectionView, acceptDrop draggingInfo: NSDraggingInfo, index: Int, dropOperation: NSCollectionView.DropOperation) -> Bool {
        if dropOperation == .before {
            return true
        }
        
        return false
    }

    func collectionView(_ collectionView: NSCollectionView, canDragItemsAt indexes: IndexSet, with event: NSEvent) -> Bool {
        return true
    }

    func collectionView(_ collectionView: NSCollectionView, draggingSession session: NSDraggingSession, willBeginAt screenPoint: NSPoint, forItemsAt indexPaths: Set<IndexPath>) {
        print("dragging session = \(session)")
    }
}

Я установил делегат в Interface Builder, но ни один из методов делегата никогда не вызывается.

Мой объект делегата также является источником данных, и все методы источника данных вызываются, как и ожидалось. Источник данных также настраивается в Interface Builder. Что еще мне нужно сделать?


person user1118321    schedule 14.07.2020    source источник
comment
Вы выбрали представление коллекции и установили для него источник данных через построитель интерфейса?   -  person El Tomato    schedule 14.07.2020
comment
Да, как упоминалось выше. Источник данных также настраивается в Interface Builder.   -  person user1118321    schedule 14.07.2020
comment
Я не могу дать вам никакого совета, если вы не покажете весь класс.   -  person El Tomato    schedule 14.07.2020
comment
Хорошо, я добавил это. Пожалуйста, дайте мне знать, если вам нужно что-то еще. Спасибо!   -  person user1118321    schedule 14.07.2020
comment
Ты должно быть шутишь. Почему вы используете NSCollectionView с NSView? NSCollectionView не является подклассом NSView. NSCollectionViewItem ЯВЛЯЕТСЯ подклассом NSView.   -  person El Tomato    schedule 14.07.2020
comment
Я не уверен, что ты пытаешься сказать. Ваш комментарий противоречит самому себе. Несмотря на это, источником данных и делегатом для NSCollectionView может быть любой класс, который вы хотите. В моем случае, поскольку это всего лишь тренировочный проект, я просто закинул их в свой класс представления, потому что это было удобно. Хотя этот факт не имеет отношения к моему вопросу. У вас есть ответ, почему мои методы делегата не вызываются? Я согласен, что это не то, как вы обычно разрабатываете приложение для доставки.   -  person user1118321    schedule 14.07.2020
comment
То, что вы пытаетесь сделать, аналогично использованию UICollectionView под UIView в iOS. NSView не является контроллером представления. Как и UIView. Это конец обсуждения.   -  person El Tomato    schedule 14.07.2020
comment
@ElTomato `NSCollectionView` является подклассом NSView. `NSCollectionViewItem` является подклассом NSViewController.   -  person Willeke    schedule 14.07.2020
comment
Отвечает ли это на ваш вопрос? Невозможно перетащить для работы в NSCollectionView   -  person Willeke    schedule 14.07.2020
comment
О да! Благодарю вас! Завершение кода снова заводит меня. ???? Спасибо за помощь. Теперь он отлично работает, несмотря на мою странную иерархию объектов.   -  person user1118321    schedule 14.07.2020