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

时间:2018-01-09 09:59:49

标签: 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)
}

我尝试创建自定义网址,如果我无法执行此操作,则取消保存操作。

现在如果我在保存之前退出应用程序,应用程序会提示我保存。如果我无法创建自定义网址并且return(在super.save…通话之前),则退出按钮或“cmd + q”无效!我要强制戒掉关闭应用程序。

任何人都能看到我在这里做错了什么?是否在后台运行阻止我关闭应用程序的东西?

更新

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

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

1 个答案:

答案 0 :(得分:1)

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

事实上,应用程序正在等待对NSTerminateLater的回复。我需要使用reply(toApplicationShouldTerminate:)函数。所以我在从守卫声明返回之前添加了NSApp.reply(toApplicationShouldTerminate: false)