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

最佳答案

尝试在对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可以由任何类型的控件使用任何类型的对其显示,编辑或选择的对象进行访问的控件。

关于iphone - undoManager用于coredata,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10378332/

10-15 13:34