撤消问题:在标题栏中没有 "edited" 标志的情况下以编程方式初始化“NSPersistentDocument”
Undo troubles: Initialise `NSPersistentDocument` programmatically without "edited" flag in title bar
我有一个使用核心数据和 NSPersistentDocument
的小应用程序。对于新文档,我使用单个 Settings
元素初始化文档。我已经可以抑制初始化生成的撤消条目,但是...
奇怪的行为是这样的:文档开始时 window 标题中没有 "edited" 标志。 我一点击 "Edit" 菜单 ,"edited" 标志就会出现,然后突然可以进行撤消操作。
这是我的 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
object的创建,这会造成很多麻烦。
这是已知问题吗?我怎样才能防止这种情况发生?
这里有一个演示效果的视频:https://youtu.be/O4lURxLAelE
致电
[self.managedObjectContext processPendingChanges];
在 disableUndoRegistration
和 enableUndoRegistration
之前。
我有一个使用核心数据和 NSPersistentDocument
的小应用程序。对于新文档,我使用单个 Settings
元素初始化文档。我已经可以抑制初始化生成的撤消条目,但是...
奇怪的行为是这样的:文档开始时 window 标题中没有 "edited" 标志。 我一点击 "Edit" 菜单 ,"edited" 标志就会出现,然后突然可以进行撤消操作。
这是我的 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
object的创建,这会造成很多麻烦。
这是已知问题吗?我怎样才能防止这种情况发生?
这里有一个演示效果的视频:https://youtu.be/O4lURxLAelE
致电
[self.managedObjectContext processPendingChanges];
在 disableUndoRegistration
和 enableUndoRegistration
之前。