swift - 如果我在 NSDocument 中取消保存操作,则无法退出应用程序

标签 swift macos nsdocument

我正在对 NSDocument 类进行子类化,以便在保存期间具有特定的行为。我将项目保存在一个文件夹中,并使用用于该项目的音频文件创建特定的子文件夹。

我重写了以下函数 save(to:ofType:for:delegate:didSave:contextInfo) 但我注意到一个奇怪的行为。假设我有以下实现:

override func save(to url: URL,
                   ofType typeName: String,
                   for saveOperation: NSDocument.SaveOperationType,
                   delegate: Any?,
                   didSave didSaveSelector: Selector?,
                   contextInfo: UnsafeMutableRawPointer?) {

    guard let customURL = createCustomUrlFrom(url: url) else { return }

    super.save(to: customURL,
               ofType: typeName,
               for: saveOperation,
               delegate: delegate,
               didSave: didSaveSelector,
               contextInfo: contextInfo)
}

我尝试创建一个自定义 URL,如果我没有成功,我会取消保存操作。

现在,如果我在保存前退出应用程序,应用程序会提示我保存。如果我无法创建自定义 URL 并且我返回(在 super.save… 调用之前),退出按钮或“cmd+q”不起作用!我必须强制退出才能关闭应用程序。

有人看到我在这里做错了吗?是否有什么东西在后台运行,阻止我关闭应用程序?

更新

也许它来自于我们退出编辑文档时提示的工作表。我们有一个窗口显示 Do you want to save the changes made to the document “Untitled”? 有 3 个按钮 Dont's save, cancel 保存...

如果我点击保存,那么项目已经存在我会显示一个窗口让用户替换项目或取消保存(这是在 createTargetUrlFrom(url:) 函数中完成的。如果用户选择取消应用程序无法退出。 所以我考虑第一个在后台运行的窗口可能......

最佳答案

我找到了这个问题的解决方案!

事实上,应用程序正在等待 NSTerminateLater 的回复。我需要使用 reply(toApplicationShouldTerminate:)功能。所以我只是在从 guard 语句返回之前添加了 NSApp.reply(toApplicationShouldTerminate: false)

关于swift - 如果我在 NSDocument 中取消保存操作,则无法退出应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48165594/

相关文章:

macos - 导出的 UTI 未被 macOS 拾取

macos - 使用 NSDocument 检测被覆盖的文件

objective-c - 启用 NSDocument 的保存

swift - Google SignIn : GIDSignIn. sharedInstance().hasAuthInKeychain() 返回 false 为什么?

macos - 相当于从 Mac OS X finder 打印 .docx 文件的命令行

macos - 插入行时保持相同的 NSTableView 滚动位置

android - Cordova 3.5.0 安装错误 - 请安装 Android Target 19

ios - 如何在一个部分中组合相同的日期对象?

ios - 音频导出失败 iOS Swift

ios - Xcode 模拟器打开。 Jenkins space 由于音频引擎导致自动化测试崩溃