【问题标题】:Swift Drag and Drop won't work outside XcodeSwift Drag and Drop 不能在 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
     {
 ... 

我在这里错过了什么?

【问题讨论】:

    标签: xcode macos debugging drag-and-drop swift


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2011-10-18
      • 1970-01-01
      • 2012-07-16
      • 2019-02-20
      • 1970-01-01
      • 2022-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多