Iphone coredata中使用的undoManager
我有两个实体A和B。A与B有一对多关系。在我更改了B中的某些属性后,如何撤消B中的所有更改?我尝试了回滚方法,但这将影响A中的其他属性。在对A进行任何更改之前,尝试在undoManager上调用Iphone coredata中使用的undoManager,iphone,ios,core-data,undo,Iphone,Ios,Core Data,Undo,我有两个实体A和B。A与B有一对多关系。在我更改了B中的某些属性后,如何撤消B中的所有更改?我尝试了回滚方法,但这将影响A中的其他属性。在对A进行任何更改之前,尝试在undoManager上调用disableUndoRegistration,在对A进行任何更改之后调用enableUndoRegistration 现在,把这个代码放在哪里?理想情况下,您应该为您的A类重写NSManagedObject中的某些方法,但哪些方法?我认为validate方法不起作用,至少不用于禁用撤消注册,因为我认为在
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”必然是模糊的,因为
发送者可以通过任何类型的控制,对其显示、编辑或选择的对象使用任何类型的访问器。您的意思是A和B都可以进行更改,并且您希望undoManager仅撤消对B所做的更改?(假设你不是指对关系成员身份的更改,这是A和B之间的互惠关系。)是的!是否有任何方法来处理此问题?我是否可以将一些更改分组并同时撤消所有更改?“撤消所有更改”?我认为这是您想要避免的。您的意思是告诉undoManager撤消一组特定的更改,跳过其他更改?不,我认为你做不到。此问题与此类似,答案是“有几种方法可以解决此问题:创建用于添加新对象的附加上下文,在取消时关闭上下文,在保存时将上下文与主上下文合并使用撤消管理器,在取消时还原任何更改。使用撤消分组对所有更改进行分组”,但是我不知道如何使用撤消分组是否可以撤消在一个视图控制器中所做的所有更改而不影响其父视图控制器?即使他们是同一个主运行中心?