使用拖放获取文件路径(Swift macOS)? [英] Get file path using drag and drop (Swift macOS)?

查看:407
本文介绍了使用拖放获取文件路径(Swift macOS)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何在Swift 2.0中实现拖放区?

how to implement a drag-and-drop zone in swift 2.0?

我构建了一个处理kext文件的应用程序,但现在,我必须手动输入输入kext的路径. 我的问题是:如何通过在区域上执行拖放操作来获取文件路径?

I built an app that processes kext files but, for now, i have to manually enter the path to the input kext. my question is: how to get file path by performing a drag and drop on a zone?

推荐答案

[更新至Swift 4.0和Xcode 9]

[Update to Swift 4.0 and Xcode 9]

灵感来自实现拖放Swift中的区域

将NSView添加到您的主视图和子类中. 该代码在Swift 4.0和macOS 10.13 High Sierra中完美地工作!

Add a NSView to your main view and subclass. This code works perfect in Swift 4.0 and macOS 10.13 High Sierra!

import Cocoa

class DropView: NSView {

    var filePath: String?
    let expectedExt = ["kext"]  //file extensions allowed for Drag&Drop (example: "jpg","png","docx", etc..)

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

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

        registerForDraggedTypes([NSPasteboard.PasteboardType.URL, NSPasteboard.PasteboardType.fileURL])
    }

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

    override func draggingEntered(_ sender: NSDraggingInfo) -> NSDragOperation {
        if checkExtension(sender) == true {
            self.layer?.backgroundColor = NSColor.blue.cgColor
            return .copy
        } else {
            return NSDragOperation()
        }
    }

    fileprivate func checkExtension(_ drag: NSDraggingInfo) -> Bool {
        guard let board = drag.draggingPasteboard().propertyList(forType: NSPasteboard.PasteboardType(rawValue: "NSFilenamesPboardType")) as? NSArray,
              let path = board[0] as? String
        else { return false }

        let suffix = URL(fileURLWithPath: path).pathExtension
        for ext in self.expectedExt {
            if ext.lowercased() == suffix {
                return true
            }
        }
        return false
    }

    override func draggingExited(_ sender: NSDraggingInfo?) {
        self.layer?.backgroundColor = NSColor.gray.cgColor
    }

    override func draggingEnded(_ sender: NSDraggingInfo) {
        self.layer?.backgroundColor = NSColor.gray.cgColor
    }

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

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

        return true
    }
}

要使用此代码,必须将"macOS部署目标"设置为10.13

To use this code you have to set "macOS Deployment Target" to 10.13

这篇关于使用拖放获取文件路径(Swift macOS)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆