2012-04-30 27 views
2

我有两个实体A和B.A与B有一对多的关系。在B中改变了一些属性之后,我如何撤销B中的所有变更?我曾尝试回滚的方法,但将在A.影响其他性能撤销管理器在coredata中使用

+1

您的意思是可能对A和B进行更改,并且您希望undoManager仅撤消对B所做的更改? (假设你不意味着关系成员变化,这是A和B之间的倒数) – Wienke

+0

yeap!有无论如何处理这个问题吗? –

回答

1

尝试调用上的UndoManager disableUndoRegistration刚刚进行任何更改A之前,只是进行任何更改A.

现在以后打电话enableUndoRegistration,在哪里放这个代码?理想情况下,你会重写你的A类NSManagedObject中的某些方法,但哪些?我认为validate方法不会起作用,至少不会禁用撤消注册,因为我认为在调用撤消管理器之前,更改可能已经注册到撤消管理器。使用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可以通过任何类型的控制,以及任何类型的访问器访问它显示或编辑或选择的对象。

+0

我可以将一些更改分组并同时撤消所有更改吗? –

+0

任何示例代码供参考? –

+0

“撤消*所有更改”?我以为那是你想避免的。 – Wienke