【发布时间】:2021-04-28 07:09:51
【问题描述】:
我想将文件拖到我的窗口,然后执行操作。
我尝试使用下面this answer中提供的sn-ps来区分你是拖动文件还是窗口。
// In my window controller
class MyWindowController: NSWindowController {
init() {
// Some initialization steps below are omitted
let win = NSWindow(...)
super.init(window: win)
let contentView = DropView(frame: win.frame)
win.contentView?.addSubview(contentView)
registerGlobalMouseEvent()
}
func registerGlobalMouseEvent() {
self.window?.acceptsMouseMovedEvents = true
NSEvent.addGlobalMonitorForEvents(matching: .leftMouseDragged, handler: { [self] event in
// Codes below will cause errors
let pasteBoard = NSPasteboard(name: .drag)
guard let fileNames = pasteBoard.propertyList(forType: .init(rawValue: "NSFilenamesPboardType")) as? NSArray else { return }
let changeCount = pasteBoard.changeCount
if fileNames.count > 0 && lastChangeCount != changeCount {
lastChangeCount = changeCount
// My actions when dragging
}
})
}
}
然后我运行我的代码并开始拖动,我得到了三个错误:
[沙盒] 获取沙盒扩展失败
[Framework] 无法为 /Users/roy/Downloads/test.txt 发布沙盒扩展,错误 1
[默认] 无法为 URL 颁发沙盒令牌:'file:///Users/roy/Downloads/test.txt' 错误:'Error Domain=NSPOSIXErrorDomain Code=1 "Operation not allowed" UserInfo={NSLocalizedDescription =无法为文件“/Users/roy/Downloads/test.txt”发出沙盒扩展:不允许操作}'
但是当我这样做的时候
NSEvent.addGlobalMonitorForEvents(matching: .leftMouseDragged, handler: { [self] event in
// My actions
})
,然后一切顺利。
第一个错误似乎无害,因为它并没有阻止我的应用程序运行。
第二个和第三个是致命的,直接导致我的应用崩溃。
不知道his code有什么问题吗? 任何有用的想法都会很棒! :)
【问题讨论】: