使用 NSOpenPanel 保存到沙盒应用程序中的目录不起作用,但 drag/drop 可以

Saving to directory in sandboxed app using NSOpenPanel doesn't work, but drag/drop does

我正在开发沙盒 OS X 应用程序,其中图像被保存到用户选择的目录中。用户可以通过两种方式选择输出目录:使用 NSOpenPanel 选择目录,以及将目录拖放到应用程序上。

当我使用 drag/drop 方法时,一切正常,我的文件保存没有问题。

但是,如果我使用 NSOpenPanel 选择目录,我会收到错误 513:

Error 513: "You don't have permission to save the file 'x.jpg' in the folder 'y'."

NSOpenPanel 和 drag/drop 代码都将它们选择的 URL 保存在同一个地方并以相同的方式处理它。什么可以解释这种差异?是否必须以特定方式设置 NSOpenPanel 以授予对目录的 read/write 权限?

郑重声明,我在过去一年使用我的应用程序时从未注意到这个问题,所以它可能是最近对 Cocoa 的更改——但我对此不是 100% 确定。

不出所料,我好像用错了 NSOpenPanel。

正在存储 URL 来自 panel(_ sender: AnyObject, validate url: URL) 中的委托调用。应该从 begin(completionHandler handler: (Int) -> Swift.Void).

中的回调调用面板的 URL 属性

在我的例子中,我错误地将我的个人文件写入通过将每个文件名连接到 URL:

创建的路径
panel.directoryURL

将其更改为:

panel.urls.first

...成功了。希望这可以避免一些麻烦。