OSX开发之如何实现拖入文件

如何在app中实现将文件拖入的功能? Drag & Drop

NSViewregisterForDraggedTypes 方法,用于声明Drag and Drop响应的文件类型

self.registerForDraggedTypes([NSFilenamesPboardType])

当有文件拖入时就会调用draggingEntered方法,该方法中判断是不是要对拖动进行响应,
如果响应则继续进入performDragOperation方法,完成处理

override func draggingEntered(sender: NSDraggingInfo) -> NSDragOperation {
    let pasteboard = sender.draggingPasteboard()
        // 在这可以判断是否是需要的文件类型 然后根据需要返回对应的值
    return NSDragOperation.Copy
}

override func prepareForDragOperation(sender: NSDraggingInfo) -> Bool {
    let pasteboard = sender.draggingPasteboard()
    if let list = pasteboard.propertyListForType(NSFilenamesPboardType) {
        // 这里会获取文件路径列表
        NSLog("list ==\n\(list)")
    }
    return true
}

ok 拖动文件功能实现了

但是!!!如果你需要用到 mouseEntered & mouseExited 或者其他的方法
你会发现响应会出现一些异常

这时候 你需要重写 updateTrackingAreas 方法

override func updateTrackingAreas() {
    let trackings = self.trackingAreas
    for tracking in trackings {
        self.removeTrackingArea(tracking)
    }

    let trackingArea = NSTrackingArea(rect: bounds, options:[.MouseEnteredAndExited, .ActiveAlways, .MouseMoved], owner: self, userInfo: nil)
    self.addTrackingArea(trackingArea)
}

就像这样~

坚持原创技术分享,您的支持将鼓励我继续创作!