撤消麻烦:以编程方式初始化`NSPersistentDocument`,而标题栏中没有“ edited”标志

问题描述 投票:3回答:1

我有一个使用核心数据和NSPersistentDocument的小应用程序。对于新文档,我使用单个Settings元素初始化该文档。我已经可以抑制初始化生成的撤消条目,但是...

奇怪的行为是这样的:文档的开头没有窗口标题中的“已编辑”标志。一旦我单击进入“编辑”菜单,就会出现“已编辑”标志,并且突然有可能执行撤消操作。

这里是我的init()代码:

class Document: NSPersistentDocument {
    var settings: Settings! = nil
    override init() {
        super.init()
        do {
            let fetchSettings = NSFetchRequest(entityName: "Settings")
            let settingsList = try self.managedObjectContext!.executeFetchRequest(fetchSettings)
            precondition(settingsList.count < 2, "Too many settings object in the core data store.")
            if settingsList.count == 1 {
                settings = settingsList[0] as? Settings
                precondition(settings != nil)
            } else {
                managedObjectContext!.undoManager!.disableUndoRegistration()
                settings = NSEntityDescription.insertNewObjectForEntityForName("Settings", inManagedObjectContext: self.managedObjectContext!) as? Settings
                precondition(settings != nil)
                // Here setup the "settings" object...
                settings.xxx = //...
                settings.yyy = //...
                managedObjectContext!.undoManager!.enableUndoRegistration()
            }
        } catch {
            preconditionFailure("Could not retrieve/create settings object because of an unknown core data error.")
        }
    }
    // ... more methods ...
}

问题是,一旦出现此撤消条目,用户就可以撤消导致很多麻烦的初始Settings对象的创建。

这是已知问题吗?如何防止这种情况发生?

这里有一个演示效果的视频:https://youtu.be/O4lURxLAelE

swift cocoa core-data nsdocument
1个回答
3
投票

通话

[self.managedObjectContext processPendingChanges];

disableUndoRegistrationenableUndoRegistration之前。

© www.soinside.com 2019 - 2024. All rights reserved.