swift - 在非沙盒中使用 Cocoa NSSavePanel 会导致断言失败
问题描述
仅在 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{
....
}
})
}
解决方案
有两种方法可以解决此问题:
保存时为您的文件名添加文件扩展名。将您的代码修改为
savePanel.nameFieldStringValue = "export.jpeg"
save panel delegate to self
通过设置和实现以下函数来实现 NSSavePanelDelegate :func panel(_ sender: Any, validate url: URL) throws { return TRUE; }
推荐阅读
- python - 有和没有@tf.function 的不同行为
- mysql - 如何在 JPQL 选择查询中从新创建的对象中按值排序实体?
- azure - OpenLiberty Docker 映像示例应用程序无法正常工作
- entity-framework-core - 更改实体框架核心代码先迁移名称格式
- c++ - 处理包含 boost::variant 的映射
作为值数据类型 - amazon-web-services - Terraform 按标签查找 s3 存储桶
- security - 在 Java EE 8 中是否有检索主体组的标准方法?
- r - 混合方差分析 (lme) 返回字母变量的错误
- javascript - 如何更新总价并在更新后保留新的数量?
- javascript - 如何避免在 axios 中发送多个重复的 AJAX 请求