У меня есть 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, но ни один из методов делегата никогда не вызывается.
Мой объект делегата также является источником данных, и все методы источника данных вызываются должным образом. Источник данных также настраивается в Интерфейсном Разработчике. Что еще мне нужно сделать?