【发布时间】:2019-04-19 21:20:58
【问题描述】:
在基于文档的应用程序中,文档中的任何更改都由
[self updateChangeCount: NSChangeDone];
在任何时候,调试时,[document isEdited] 返回 TRUE,只要文档已被编辑。文档的窗口在文档名称旁边显示“已修改”。当我退出应用程序时,我的应用程序代表会使用以下循环检查所有打开的文档,并检查它们是否已被编辑:
NSUInteger needsSaving = 0;
while (count--) {
NSWindow *window = [windows objectAtIndex:count];
Document *document = [Document documentForWindow:window];
if (document && [document isDocumentEdited]) needsSaving++;
}
似乎对于任何文档——无论是否修改——
[document isDocumentEdited]; 总是返回 FALSE!这样就无法调用审核更改/保存过程。如果我检查[window isDocumentEdited],它也会返回 FALSE,尽管窗口的标题栏中写有“Modified”。
当应用程序退出时,更改最终会被保存(自动),但不会通知用户。这是一种非常令人不安的行为!
知道什么可以解释 isDocumentEdited 布尔值在进入此过程之前在某处重置为 FALSE 吗?
我检查了所有代码以查看是否没有可以在某处运行的[self updateChangeCount: NSChangeCleared],但事实并非如此。我可以在我的 Document 子类中使用自定义 updateChange 计数系统来规避这个问题,但我更愿意使用内置进程。
在 Mojave 下使用 Xcode 10,目标为 10.12
【问题讨论】:
-
什么时候,用什么方法检查?
-
在应用程序委托的 applicationShouldTerminate: 中
-
我注意到,当对文档进行更改时,所有文档窗口都会在窗口标题附近获得“已修改”条目,即使对于未修改的文档也是如此
-
如何创建文档、窗口控制器和窗口? undo是如何实现的?
-
文档、窗口控制器和窗口是使用 IB 创建的(文件菜单中的新功能,其余的使用 makeWindowController 创建)。我禁用了所有撤消操作以确保撤消系统不涉及问题!我设置了一个转身,使用自创标志,问题在我的应用程序中得到解决。但我宁愿使用内置系统也不愿绕过它!
标签: macos save nsdocument document-based