在我的核心数据模型中,我有一个名为listItems
的关系,该关系链接到多个listItem
个实体,每个实体都有一个stringValue
属性。我创建了一个控件,它实际上是NSTextFields
的列表,每个列表项都有一个。控件正确绑定到listItems
,并且我已将其设置为按下返回键,直接在当前编辑的字段下创建一个新字段,并将焦点更改为新字段。因此,基本上,为了添加新项目,用户按下Return。
同样,如果用户结束编辑并且当前编辑的字段为空,则删除该字段(如图所示,空字段仅在“编辑模式”期间出现,可以这么说)。这非常有效。基本上,在我的listItem
NSManagedObject子类中,我执行以下操作:
// Don't allow nil values
if (!value && [[self.recipe ingredients] count] > 1) {
for (EAIngredientRef *ingredient in [self.recipe ingredients]) {
if ([[ingredient sortIndex] integerValue] > [[self sortIndex] integerValue]) {
[ingredient setSortIndex:[NSNumber numberWithInteger:([[ingredient sortIndex] integerValue]-1)]];
}
}
[[self managedObjectContext] deleteObject:self];
return;
}
// Code to handle if it is a real value
我遇到的问题是,每次以这种方式删除行时,它都会向undoManager注册。因此,如果我编辑一行,请按Return键(创建一个新行),然后单击“离开”以结束编辑,该行将消失。但是,如果我然后撤消,则会再次出现空字段。我的目标是让undoManager忽略涉及空字段的删除操作。
我该怎么做?我已尝试在多个位置使用[[[self managedObjectContext] undoManager] disableUndoRegistration]
和关联的enableUndoRegistration
(例如-didTurnIntoFault
,但我怀疑撤消注册可能在该方法之前发生)
答案 0 :(得分:19)
如果您更深入地深入了解核心数据文档,您会发现这一点被隐藏起来:
[[self managedObjectContext] processPendingChanges];
[[[self managedObjectContext] undoManager] disableUndoRegistration];
// Do your work
[[self managedObjectContext] processPendingChanges];
[[[self managedObjectContext] undoManager] enableUndoRegistration];
在事件循环结束之前,通常没有向撤消管理器注册更改,因此在之后注册了,您又重新启用了撤消注册。以上情况迫使它在你想要的时候发生。