初始化文档并将其标记为"unchanged"
Initialize a document and mark it as "unchanged"
我正在尝试在 Swift 中编写我的第一个核心数据驱动的面向文档的 OSX 应用程序,因为我想更多地了解 Mac 编程。这些文档应该只保存为 XML 个文件,我已经成功配置了这些文件。
问题是我想在初始化时预先向文档添加一些信息,而实际上 "modifying" 文档。该信息只是必需的,应该在文档中,但如果用户创建并立即关闭文档,则不应要求他保存。
我已经定义了我的 Core Data 数据模型,并且我已经从我的模型中创建了 NSManagedObject
个子类。在我文档的 init
方法中,我这样做:
override init() {
super.init()
// Add your subclass-specific initialization here.
let newItem = NSEntityDescription.insertNewObjectForEntityForName("MyItem", inManagedObjectContext: self.managedObjectContext) as! MyItem;
newItem.descriptionText = "Item number 1";
newItem.itemNumber = 1;
}
这确实在我的文档中添加了一个新项目,当我保存并重新加载时,我可以验证该项目是否存在。但是,这样做时,文档被标记为 "dirty" 并且在关闭它时,要求用户保存更改。
如何在不实际将文档标记为已编辑的情况下执行数据模型的初始化?
对于那些感兴趣的人,我设法解决了这个问题以适用于我的情况。首先,我将初始化代码移至
convenience init?(type typeName: String, error outError: NSErrorPointer)
那我暂时停止撤消功能:
self.managedObjectContext.processPendingChanges();
self.undoManager.disableUndoRegistration();
进行更改后,我重新启用撤消功能:
self.managedObjectContext.processPendingChanges();
self.undoManager.enableUndoRegistration();
到目前为止效果很好。
我正在尝试在 Swift 中编写我的第一个核心数据驱动的面向文档的 OSX 应用程序,因为我想更多地了解 Mac 编程。这些文档应该只保存为 XML 个文件,我已经成功配置了这些文件。
问题是我想在初始化时预先向文档添加一些信息,而实际上 "modifying" 文档。该信息只是必需的,应该在文档中,但如果用户创建并立即关闭文档,则不应要求他保存。
我已经定义了我的 Core Data 数据模型,并且我已经从我的模型中创建了 NSManagedObject
个子类。在我文档的 init
方法中,我这样做:
override init() {
super.init()
// Add your subclass-specific initialization here.
let newItem = NSEntityDescription.insertNewObjectForEntityForName("MyItem", inManagedObjectContext: self.managedObjectContext) as! MyItem;
newItem.descriptionText = "Item number 1";
newItem.itemNumber = 1;
}
这确实在我的文档中添加了一个新项目,当我保存并重新加载时,我可以验证该项目是否存在。但是,这样做时,文档被标记为 "dirty" 并且在关闭它时,要求用户保存更改。
如何在不实际将文档标记为已编辑的情况下执行数据模型的初始化?
对于那些感兴趣的人,我设法解决了这个问题以适用于我的情况。首先,我将初始化代码移至
convenience init?(type typeName: String, error outError: NSErrorPointer)
那我暂时停止撤消功能:
self.managedObjectContext.processPendingChanges();
self.undoManager.disableUndoRegistration();
进行更改后,我重新启用撤消功能:
self.managedObjectContext.processPendingChanges();
self.undoManager.enableUndoRegistration();
到目前为止效果很好。