Swift:在窗口中通过拖放打开文件

时间:2014-12-25 05:27:33

标签: macos swift

在Swift中,如何在我的Mac应用程序窗口中构建一个区域,用户可以将文件夹拖放到此区域,让我的应用程序接收文件夹的路径?

原则上,在我看来,这是与Apple的CocoaDragAndDrop example应用程序类似的概念。我试图通过理解源代码来解决问题,但应用程序是用Objective-C编写的,我没有成功地在我正在构建的应用程序中复制其功能。

提前谢谢。

3 个答案:

答案 0 :(得分:5)

在自定义NSView中:

override init(frame frameRect: NSRect)
{
    super.init(frame: frameRect)
    registerForDraggedTypes([kUTTypeFileURL,kUTTypeImage])
}

override func draggingEntered(sender: NSDraggingInfo) -> NSDragOperation
{
    println("dragging entered")
    return NSDragOperation.Copy
}

问题是,为了让它工作,我必须将自定义视图作为叶子和故事板中的最后一个视图

答案 1 :(得分:2)

这对我有用(在NSWindow子类上):

在awakeFromNib中:

registerForDraggedTypes([NSFilenamesPboardType])

然后将以下操作(至少是draggingEntered和performDragOperation)添加到窗口(或视图):

func draggingEntered(sender: NSDraggingInfo) -> NSDragOperation {
    let sourceDragMask = sender.draggingSourceOperationMask()
    let pboard = sender.draggingPasteboard()!
    if pboard.availableTypeFromArray([NSFilenamesPboardType]) == NSFilenamesPboardType {
        if sourceDragMask.rawValue & NSDragOperation.Generic.rawValue != 0 {
            return NSDragOperation.Generic
        }
    }
    return NSDragOperation.None
}

func draggingUpdated(sender: NSDraggingInfo) -> NSDragOperation {
    return NSDragOperation.Generic
}

func prepareForDragOperation(sender: NSDraggingInfo) -> Bool {
    return true
}

func performDragOperation(sender: NSDraggingInfo) -> Bool {
   // ... perform your magic
   // return true/false depending on success
}

答案 2 :(得分:0)

我为OSX支付2美分-迅捷5(固定为从XIB / storybord加载。)

//  Created by ing.conti on 31th jan 2020.
//

import Cocoa

class AnalysisView: NSView {

    override init(frame frameRect: NSRect)
    {
        super.init(frame: frameRect)
        self.registerMyTypes()
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
        self.registerMyTypes()
    }


    final private func registerMyTypes()
    {
        registerForDraggedTypes(
            [NSPasteboard.PasteboardType.URL,
             NSPasteboard.PasteboardType.fileURL,
             NSPasteboard.PasteboardType.png,
             NSPasteboard.PasteboardType.fileNameType(forPathExtension: "wtf")
        ])
    }



    override func draggingEntered(_ sender: NSDraggingInfo) -> NSDragOperation {
        print("draggingEntered")
        return NSDragOperation.copy
    }

    override func prepareForDragOperation(_ sender: NSDraggingInfo) -> Bool {
        let allow = true // check your types...
        print("prepareForDragOperation")
        return allow
    }

    override func performDragOperation(_ sender: NSDraggingInfo) -> Bool {

        let pasteBoard = sender.draggingPasteboard
        print("performDragOperation")

        if let urls = pasteBoard.readObjects(forClasses: [NSURL.self]) as? [URL]{
            // consume them...
            print(urls)
            return true
        }
        return false
    }
}