LoginSignup
6
4

More than 5 years have passed since last update.

ドラッグ&ドロップされたファイルのパスを(複数)取得する

Last updated at Posted at 2017-11-20

概要

ファイルをドラッグ&ドロップされた時、そのファイルパスを取得する。ファイルが複数であればそれら全てのファイルパスを取得する。

ネット上にはいくつか情報があるが、最新のSwiftでは動かないものも多いので、ここにメモとしてまとめておく。

環境

Swift 4.0
macOS 10.13.1
Xcode 9.0.1

コード

ドロップ先にしたいViewを継承し、以下のようなコードを実装する。

ちなみに、NSPasteboard.PasteboardType.fileURLが
macOS 10.13以上でないと使えないというエラーが出てしまう。
何か情報をお持ちの方は教えていただけるとありがたいです。

FileDropView.swift
import Cocoa

class FileDropView: NSView {

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

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

    func commonInit() {
        self.registerForDraggedTypes([.fileURL])
    }

    override func draw(_ dirtyRect: NSRect) {
        super.draw(dirtyRect)
    }

    func shouldAllowDrag(_ draggingInfo: NSDraggingInfo) -> Bool {
        let pboard = draggingInfo.draggingPasteboard()

        if pboard.canReadObject(forClasses: [NSURL.self], options: nil) {
            return true
        }
        return false
    }

    override func draggingEntered(_ sender: NSDraggingInfo) -> NSDragOperation {
        return shouldAllowDrag(sender) ? [.copy] : []
    }

    override func prepareForDragOperation(_ sender: NSDraggingInfo) -> Bool {
        return shouldAllowDrag(sender)
    }

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

        if let urls = pboard.readObjects(forClasses: [NSURL.self], options: nil) as? [URL] {
            for url in urls {
                print(url)
                // 何らかの処理
            }
        }
        return true
    }
}

更新履歴

2017.11.21 投稿

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4