2

我有两个实体 A 和 B。A 与 B 具有一对多关系。在更改 B 中的某些属性后,如何撤消 B 中的所有更改?我尝试过回滚方法,但这会影响 A 中的其他属性。

4

1 回答 1

1

尝试disableUndoRegistration在对 A 进行任何更改之前调用 undoManager,并在对 AenableUndoRegistration进行任何更改之后调用。

现在,把这段代码放在哪里?理想情况下,您会为您的 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可以通过任何类型的控件,使用任何类型的访问器访问它显示或编辑或选择的对象。

于 2012-04-30T11:28:08.370 回答