#概要
ファイルをドラッグ&ドロップされた時、そのファイルパスを取得する。ファイルが複数であればそれら全てのファイルパスを取得する。
ネット上にはいくつか情報があるが、最新の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 投稿