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

Posted

技术标签:

【中文标题】撤消麻烦:以编程方式初始化`NSPersistentDocument`,标题栏中没有“已编辑”标志【英文标题】:Undo troubles: Initialise `NSPersistentDocument` programmatically without "edited" flag in title bar 【发布时间】:2016-04-05 15:50:11 【问题描述】:

我有一个使用核心数据和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

【问题讨论】:

【参考方案1】:

打电话

[self.managedObjectContext processPendingChanges];

disableUndoRegistrationenableUndoRegistration 之前。

【讨论】:

以上是关于撤消麻烦:以编程方式初始化`NSPersistentDocument`,标题栏中没有“已编辑”标志的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式添加 imageview 约束问题

mitmproxy:撤消编辑的快捷方式

Cocoa - 如何以编程方式初始化视图?

在带有 XIB 的视图控制器上以编程方式初始化 UISegmentedControl

为啥我们不能在以编程方式设置初始视图控制器时以编程方式在视图控制器之间跳转?

Swift:不能以编程方式配置自定义表格单元格?没有调用初始化?