首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在NSTokenField中删除令牌

在NSTokenField中删除令牌
EN

Stack Overflow用户
提问于 2015-07-27 15:44:18
回答 1查看 627关注 0票数 2

我正在实现一个应用程序,可以将来自NSTableView的行拖放到NSTokenField中,但我很难实现交互的下降端。我已经子类NSTokenField (如下面的调试代码所示)。但我只看到对draggingEntered:updateDraggingItemsForDrag:方法的调用。即使我返回一个有效的NSDragOperation (Copy),NSDraggingDestination中的其他任何方法都不会被调用。移动令牌字段时,光标会短暂地闪烁到复制图标,然后返回到普通游标。

为了调试目的,我尝试实现与NSDraggingDestination相关的所有方法,如下面的代码所示。是否有另一个类或NSTokenField的一部分正在处理这个拖放?有可能推翻它吗?

我已经确认,纸板确实有数据与有效的纸板类型。

代码语言:javascript
复制
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)")
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-28 20:08:03

多亏了@stevesliva的评论,我才能解决这个问题。我发现了一些重要的警告(部分原因可能是我对黑板和拖放交互的无知)。

  1. 没有必要对NSTokenField类进行子类分类。
  2. 我必须为令牌字段实现委托函数tokenField(tokenField: NSTokenField, readFromPasteboard pboard: NSPasteboard) -> [AnyObject]?
  3. 我必须更改拖动的开始,以便将字符串值存储到黑板上。看起来,如果pasteboard没有字符串值,那么就不会调用上面的委托函数。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31657495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档