NSOpenPanel/NSSavePanel在Swift 3中崩溃

5

在Swift 3/Xcode8.1/10.12.2中,我正在尝试使用NSOpenPanel来获取一个文本文件,以下是由DenBeke编写的代码:

@IBAction func browseFile(sender: AnyObject) {

  let dialog = NSOpenPanel();

  dialog.title                   = "Choose a .txt file";
  dialog.allowedFileTypes        = ["txt"];

  if (dialog.runModal() == NSModalResponseOK)
  {
     let result = dialog.url // Pathname of the file

     if (result != nil) {
        let path = result!.path
        print("browseFile path: \(path)")
        //filename_field.stringValue = path
     }
  } else {
     // User clicked on "Cancel"
     return
  }
}

该代码打开了打开对话框,我可以选择文件。但是,点击打开按钮会导致应用程序崩溃。在控制台中,我得到以下信息:
FI_TFloatingInputWindowController对象0x60800009c0c0在已经释放时过度释放;在objc_overrelease_during_dealloc_error上断点调试
当我运行代码并打开对话框时,在控制台中我得到以下信息:
[default] [ERROR] Failed getting container for URL: file:///Users/ruediheimlicher/Documents/LoggerdataDir/Messungen/, error: Error Domain=BRCloudDocsErrorDomain Code=12 "App library not found: 'com.apple.Documents'" UserInfo={NSDescription=App library not found: 'com.apple.Documents'}
但这不影响应用程序。
网络上有更多关于NSOpen或NSSave对话框的示例代码,但每个示例都会导致相同的结果:崩溃,并在控制台上显示完全相同的错误消息。
我的代码是否存在错误?是否有Swift3 / sierra的可用示例?
2个回答

9
请给您的应用程序赋予用户选择的文件访问权限,在<您的项目> -> <您的目标> -> 能力 -> 应用程序沙盒 -> 文件访问 -> 用户选择的文件下进行设置。

User Selected File Permission


我的项目中没有这样的设置。 - heimi
@heimi 我已经调整了我的答案以适应最新的Xcode版本。 - John
2
我现在收到日志,其中包含“无法获取URL的所有者UUID:”,这些URL指向我6年前作为管理员最后登录的计算机上的文件。 - heimi
黑米,你解决了这个问题吗?我也遇到了这个问题。可能是某个偏好设置文件引起的吗? - adamteale

3

[默认] [错误] 无法获取 URL(文件:///Users/ruediheimlicher/Documents/LoggerdataDir/Messungen/)对应的容器,错误信息:Error Domain=BRCloudDocsErrorDomain Code=12 "找不到应用程序库:“com.apple.Documents”" UserInfo={NSDescription=找不到应用程序库:“com.apple.Documents”}

要删除此输出,您需要在 Finder 首选项中启用 iCloud Drive。

  • 打开 Finder
  • 打开首选项
  • 选择第三个标签页(侧边栏)
  • 勾选 iCloud Drive

然后重新运行您的应用程序。


iCloudPreferences 用于 Code 2 错误:Code=2 "已注销 - 未配置 iCloud Drive" UserInfo={NSDescription=已注销 - 未配置 iCloud Drive},但上述错误是 Code 12 找不到应用程序库,而 iCloudPreferences 无法解决此问题。 - silicontrip

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接