我正在实现一个应用程序,可以将来自NSTableView的行拖放到NSTokenField中,但我很难实现交互的下降端。我已经子类NSTokenField (如下面的调试代码所示)。但我只看到对draggingEntered:和updateDraggingItemsForDrag:方法的调用。即使我返回一个有效的NSDragOperation (Copy),NSDraggingDestination中的其他任何方法都不会被调用。移动令牌字段时,光标会短暂地闪烁到复制图标,然后返回到普通游标。
为了调试目的,我尝试实现与NSDraggingDestination相关的所有方法,如下面的代码所示。是否有另一个类或NSTokenField的一部分正在处理这个拖放?有可能推翻它吗?
我已经确认,纸板确实有数据与有效的纸板类型。
let kPasteboardType = "SamplePasteboardType"
class MyTokenField : NSTokenField
{
override func draggingEntered(sender: NSDraggingInfo) -> NSDragOperation {
// entered
NSLog("ENTERED")
// must come from same window
guard self.window == sender.draggingDestinationWindow() else {
return super.draggingEntered(sender)
}
// has valid pasteboard data?
let pb = sender.draggingPasteboard()
if let _ = pb.dataForType(kPasteboardType) {
NSLog("MATCHED")
return NSDragOperation.Copy
}
return super.draggingEntered(sender)
}
override func draggingUpdated(sender: NSDraggingInfo) -> NSDragOperation {
NSLog("UPDATED")
// must come from same window
guard self.window == sender.draggingDestinationWindow() else {
return super.draggingUpdated(sender)
}
// has valid pasteboard data?
let pb = sender.draggingPasteboard()
if let _ = pb.dataForType(kPasteboardType) {
return NSDragOperation.Copy
}
return super.draggingUpdated(sender)
}
override func draggingExited(sender: NSDraggingInfo?) {
NSLog("EXITED")
super.draggingExited(sender)
}
override func prepareForDragOperation(sender: NSDraggingInfo) -> Bool {
NSLog("PREPARE")
return super.prepareForDragOperation(sender)
}
override func performDragOperation(sender: NSDraggingInfo) -> Bool {
NSLog("PERFORM")
return super.performDragOperation(sender)
}
override func concludeDragOperation(sender: NSDraggingInfo?) {
NSLog("CONCLUDE")
super.concludeDragOperation(sender)
}
override func draggingEnded(sender: NSDraggingInfo?) {
NSLog("ENDED")
super.draggingEnded(sender)
}
override func updateDraggingItemsForDrag(sender: NSDraggingInfo?) {
// super.updateDraggingItemsForDrag(sender)
guard let drag = sender else {
return
}
let classes: [AnyClass] = [NSPasteboardItem.self]
let options: [String: AnyObject] = [NSPasteboardURLReadingContentsConformToTypesKey: [kPasteboardType]]
drag.enumerateDraggingItemsWithOptions(NSDraggingItemEnumerationOptions.ClearNonenumeratedImages, forView: self, classes: classes, searchOptions: options) {
(item, idx, stop) in
NSLog("\(item)")
}
}
}发布于 2015-07-28 20:08:03
多亏了@stevesliva的评论,我才能解决这个问题。我发现了一些重要的警告(部分原因可能是我对黑板和拖放交互的无知)。
NSTokenField类进行子类分类。tokenField(tokenField: NSTokenField, readFromPasteboard pboard: NSPasteboard) -> [AnyObject]?。https://stackoverflow.com/questions/31657495
复制相似问题