【问题标题】:Using Cocoa NSSavePanel in non-Sandboxed causes Assertion failure在非沙盒中使用 Cocoa NSSavePanel 会导致断言失败
【发布时间】:2020-03-10 13:08:40
【问题描述】:

仅在 MacOS 10.15 中,仅在尝试将文件两次保存到同一目录时,并且仅在打开 NSOpenPanel 之后点击取消或打开。我的应用因以下堆栈跟踪而挂起,并且应用无法恢复,我不得不将其杀死。

*** -[NSSavePanel _attachSandboxExtensions:toURL:orURLs:] 中的断言失败,/BuildRoot/Library/Caches/com.apple.xbs/Sources/AppKit/AppKit- 1894.30.142/Nav.subproj/OpenAndSavePanelRemote/NSVBOpenAndSavePanels.m:711 -[NSSavePanel observeValueForKeyPath:ofObject:change:context:] 捕获非致命 NSInternalInconsistencyException '沙盒扩展字符串的意外类类型!'和 回溯(

0   CoreFoundation                      0x00007fff2bc5c8ab __exceptionPreprocess + 250
1   libobjc.A.dylib                     0x00007fff61f16805 objc_exception_throw + 48
2   CoreFoundation                      0x00007fff2bc85d10 +[NSException raise:format:arguments:] + 88
3   Foundation                          0x00007fff2e37e241 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 191
4   AppKit                              0x00007fff297987b2 __53-[NSSavePanel _attachSandboxExtensions:toURL:orURLs:]_block_invoke + 240
5   CoreFoundation                      0x00007fff2bbd4037 __NSARRAY_IS_CALLING_OUT_TO_A_BLOCK__ + 7
6   CoreFoundation                      0x00007fff2bbeac36 -[__NSSingleObjectArrayI enumerateObjectsWithOptions:usingBlock:] + 80
7   AppKit                              0x00

有没有人有同样的问题和解决方案?

这是我用来保存文件的代码:

@IBAction func saveAct(_ sender: Any) {
 let savePanel = NSSavePanel()
 defaultPath = UserDefaultUtil.pathDir

 savePanel.directoryURL = URL(fileURLWithPath: defaultPath)
 savePanel.nameFieldStringValue = "export"
 savePanel.allowedFileTypes = ["jpeg"]
 savePanel.accessoryView = accessoryView

 // <--------------- Assertion failure HERE (the beginSheetModal not called) 

 savePanel.beginSheetModel(for: self.view.window!, completionHandler: {(num) -> Void in

      if num == .OK {
           ....
      }else{
           ....
      }
 })

}

【问题讨论】:

  • 我也有同样的问题。非沙盒应用,可在 Catalina 上运行,但在第一次尝试保存文件时,它会因相同的堆栈跟踪而崩溃。

标签: swift xcode macos cocoa nssavepanel


【解决方案1】:

有两种方法可以解决这个问题:

  1. 在保存时为您的文件名添加文件扩展名。修改你的代码

    savePanel.nameFieldStringValue = "export.jpeg"

  2. 通过设置save panel delegate to self实现NSSavePanelDelegate,实现如下功能:

    func panel(_ sender: Any, validate url: URL) throws { return TRUE; }

【讨论】:

  • 在目标 C 中,这些似乎都无法解决问题。
【解决方案2】:

确保您在savePanel.directoryURL 中分配目录路径,而不是文件路径。 例如: savePanel.directoryURL 应该有一个值 /Users/macbook/Documents/ 不是/Users/macbook/Documents/file.txt

【讨论】:

    猜你喜欢
    • 2018-06-05
    • 2023-04-07
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多