Swift Drag and Drop 不能在 Xcode 之外工作

Posted

技术标签:

【中文标题】Swift Drag and Drop 不能在 Xcode 之外工作【英文标题】:Swift Drag and Drop won't work outside Xcode 【发布时间】:2014-11-01 15:01:09 【问题描述】:

我有一些代码,可以在命令行工具中使用。现在我想让它成为一个 Drop-Applet 来通过终端和路径。我将一些文件放到它上面,只要附加了调试器,它就可以像魅力一样工作。

到目前为止一切顺利,但是当我直接启动它(从 Xcode 输出目录)时,似乎不接受拖放。 (动画文件回原点)。

class dragView : NSView, NSDraggingDestination 

 required init(coder: NSCoder) 
     super.init(coder: coder)
 

 override init(frame: NSRect) 
     super.init(frame: frame)
     let types = [NSFilenamesPboardType, NSURLPboardType]
     registerForDraggedTypes(types)
 

 override func drawRect(dirtyRect: NSRect)  
     super.drawRect(dirtyRect)
     NSColor.whiteColor().set()
     NSRectFill(dirtyRect)
 

 override func draggingEntered(sender: NSDraggingInfo!) -> NSDragOperation  
     return NSDragOperation.Copy
 


 override func draggingUpdated(sender: NSDraggingInfo!) -> NSDragOperation 
     return NSDragOperation.Copy
 

 override func performDragOperation(sender: NSDraggingInfo!) -> Bool 
     let pboard: NSPasteboard = sender.draggingPasteboard()

     let array : [String] = pboard.propertyListForType(String(NSFilenamesPboardType)) as [String]
     for item in array
     
 ... 

我在这里错过了什么?

【问题讨论】:

【参考方案1】:

您的代码不起作用,因为您必须将拖动类型注册到 init(coder:) 函数中。 这段代码在 Swift 3 中运行良好

import Cocoa

class DropView : NSView 

    required init?(coder: NSCoder) 
        super.init(coder: coder)

        let types = [NSFilenamesPboardType, NSURLPboardType]
        register(forDraggedTypes: types)

        self.wantsLayer = true
        self.layer?.backgroundColor = NSColor.white.cgColor
    

    override func draw(_ dirtyRect: NSRect) 
        super.draw(dirtyRect)
        // Drawing code here.
    

    override func draggingEntered(_ sender: NSDraggingInfo) -> NSDragOperation  
        return .copy
    

    override func performDragOperation(_ sender: NSDraggingInfo) -> Bool 
        guard let pasteboard = sender.draggingPasteboard().propertyList(forType: "NSFilenamesPboardType") as? NSArray,
              let path = pasteboard[0] as? String
        else  return false 

        //GET YOUR FILE PATH !!
        Swift.print("FilePath: \(path)")

        return true
    

一个更有用的例子here

【讨论】:

以上是关于Swift Drag and Drop 不能在 Xcode 之外工作的主要内容,如果未能解决你的问题,请参考以下文章

angular-drag-and-drop-lists 拖动的元素消失(chrome)

原生拖拽,拖放事件(drag and drop)

PYQT5 (十八)文件拖放(drag and drop)并获取文件信息

python selenium drag_and_drop()和drag_and_drop_with_offset()怎么使用?

jQuery UI Drag and Drop/Sortable Drop on empty,在 Chrome

Qt Drag and Drop - 拖动时更改图像显示