【发布时间】:2019-08-08 15:05:54
【问题描述】:
我的沙盒 macOS 应用程序按照惯例通过NSOpenPanel 模态窗口导入用户选择的图像文件。
首先,我将面板配置为canChooseDirectories = false,并将allowedFileTypes 属性设置为NSImage.imageTypes。到目前为止一切顺利。
使用该应用程序后,我意识到我想要导入的图像通常被分组在一个文件夹中,其中没有任何其他内容。如果我可以让用户只选择包含文件夹并在“批发”中导入图像,那就太好了,所以我采用了这个代码:
let panel = NSOpenPanel()
panel.allowsMultipleSelection = true
panel.canChooseDirectories = true
panel.canCreateDirectories = false
panel.canChooseFiles = true
panel.allowedFileTypes = NSImage.imageTypes
panel.begin { [unowned self] (result) in
guard result == .OK else {
return // User cancelled
}
// Read all selected images:
let urls: [URL] = {
if let directory = panel.directoryURL {
// .........................................
// [A] One directory selected:
do {
let urls = try FileManager.default.contentsOfDirectory(at: directory, includingPropertiesForKeys: nil, options: [])
return urls
} catch {
// (I ALWAYS END UP HERE)
print(error.localizedDescription)
return []
}
} else {
// .........................................
// [B] One or more files selected:
return panel.urls
}
}()
// (next: read individual urls...)
...但是try 语句总是失败,catch 块被执行并且抛出的错误是:
“无法打开文件“MyImageFolder”,因为您无权查看它。”
对于沙盒应用,有没有办法解决这个问题?我忘记了哪些可以让我读取用户选择的文件夹的内容?
附录: Apple's documentation 声明:
当您的应用程序的用户指定他们要使用文件或文件夹时,系统会将关联的路径添加到您的应用程序的沙箱中。例如,用户将 ~/Documents 文件夹拖到应用程序的 Dock 磁贴(或应用程序的 Finder 图标,或应用程序的打开窗口)上,从而表明他们想要使用该文件夹。作为响应,系统使 ~/Documents 文件夹、其内容及其子文件夹可供您的应用使用。
(强调我的)
【问题讨论】:
标签: macos cocoa sandbox nsopenpanel