我有两个实体A和B.A与B有一对多的关系。在B中更改了一些属性后,如何撤消B中的所有更改?我尝试过回滚方法,但这会影响A中的其他属性。
答案 0 :(得分:1)
在对A进行任何更改之前尝试在undoManager上调用disableUndoRegistration
,并在对A进行任何更改后立即调用enableUndoRegistration
。
现在,在哪里放这个代码?理想情况下,你会为你的A类覆盖NSManagedObject中的某些方法,但是哪些方法呢?我认为validate
方法不起作用,至少不能用于禁用撤销注册,因为我认为在调用时可能已经在undoManager中注册了更改。使用will/didChangeValueForKey:
很诱人 - 但是类引用说“你不能覆盖这个方法。”
所以我认为你在任何可能影响A的界面动作中都会遇到这种情况。
编辑 - 这是您要求的样本:
- (IBAction) someAction:(id)sender {
BOOL isA = NO;
NSManagedObjectContext currentContext = nil;
if ([[sender objectControlledBySender] isKindOfClass:[subclassedManagedObjectA class]]) {
isA = YES;
currentContext = // get a ref to your current context, or just make it an unretained property of this controller's class
[currentContext.undoManager disableUndoRegistration];
}
// Make the changes to the object accessed via sender.
if (isA)
[currentContext.undoManager enbleUndoRegistration];
}
“objectControlledBySender”必然含糊不清,因为sender
可以通过任何类型的控制,对其显示或编辑或选择的对象具有任何类型的访问者。