NSCollectionView`validdrop`委托没有被调用

时间:2017-02-18 22:19:12

标签: swift drag-and-drop nscollectionview

我有一个简单的1个部分NSCollectionView并且对于没有让拖放工作变得疯狂。集合视图具有自定义集合视图项,其标签显示自定义对象的数据。一切都有效,直到拖动的项目应该在新位置之间掉落。但是当我拖动项目时,放置目的地没有掉落指示符(通常是间隙)。我发现下面的NSCollectionView代表没有被调用。

func collectionView(_ collectionView: NSCollectionView, validateDrop draggingInfo: NSDraggingInfo,
                   proposedIndexPath proposedDropIndexPath: AutoreleasingUnsafeMutablePointer<NSIndexPath>,
                   dropOperation proposedDropOperation: UnsafeMutablePointer<NSCollectionViewDropOperation>) -> NSDragOperation {

    print("validateDrop", proposedDropIndexPath) // never shows up in the console

    if proposedDropOperation.pointee == NSCollectionViewDropOperation.on {
        proposedDropOperation.pointee = NSCollectionViewDropOperation.before
    }
        print("validateDrop", proposedDropIndexPath)
        return NSDragOperation.move
    }

我想念什么? 谢谢!

修改1

我只想使用拖放功能来重新排序集合视图中的项目。它不打算在集合视图中拖动外部内容。

2 个答案:

答案 0 :(得分:1)

您应该注册与 collectionView(_:, pasteboardWriterForItemAt:) 的返回匹配的适当拖动类型

例如,如果我们想添加一个 NSImage 到粘贴板,我们应该为集合视图注册 tiff 类型。

self.collectionView.registerForDraggedTypes([.tiff])
func collectionView(_ collectionView: NSCollectionView,
                         indexPath: IndexPath) -> NSPasteboardWriting? {
        SnsDebug("collectionView pasteboardWriterForItemAt")
        let image = self.viewModel.images.value[indexPath.item]
        return image as NSPasteboardWriting? // NSImage
    }

答案 1 :(得分:0)

您是否为拖动类型注册了集合视图?

  collectionView.registerForDraggedTypes([NSPasteboard.PasteboardType])