在我的应用中,用户可以快速在对象之间来回切换,并编辑这些对象上的文本。
当他们按“撤消”时,我想调出相关对象,以便他们可以看到他们正在执行的撤消。
对象是NSManagedObject
子类的实例,我正在使用创建managedObjectContext
时获得的UIManagedDocument
附带的撤消管理器。
撤消& redo运行正常。
如何确定给定撤消操作的哪个对象“撤消”?
答案 0 :(得分:1)
所以我想出来了。我需要的方法是:
可以在NSManagedObject的子类中重写。
只要对象受到撤消或重做的影响,就会调用此方法。我之前的印象是,只有在撤消插入或删除对象时才会调用它,但如果对象也被更改,则会调用它。
我在这个方法中做的是发布一个包含objectID的通知,然后当我收到该通知时,我去找到与我收到的objectID对应的对象。
所以在我的NSManagedObject子类中,我的awakeFromSnapshotEvents看起来像这样:
- (void)awakeFromSnapshotEvents:(NSSnapshotEventType)flags {
NSManagedObjectID *thisID = self.objectID;
NSDictionary *userInfo = [NSDictionary dictionaryWithObject:thisID forKey:@"noticeObjectID"];
[[NSNotificationCenter defaultCenter] postNotificationName:@"awakeFromSnapshotNotification" object:self userInfo:userInfo];
}
在接收者的viewWillAppear中,我注册了通知:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didAwakeManagedObject:) name:@"awakeFromSnapshotNotification" object:nil];
最后,我的接收者的didAwakeManagedObject:
方法看起来像这样。可能有更好的方法来做到这一点,但这对我来说很好。我碰巧关注在Core Data支持的NSOrderedSet中我需要的对象的索引位置,所以我只是遍历有序集,直到找到正确的。
- (void) didAwakeManagedObject:(NSNotification*)notice {
for (int i=0; i<project.orderedSet.count; i++) {
if ([notice.userInfo objectForKey:@"noticeObjectID"] == [[project.orderedSet objectAtIndex:i] objectID]) {
NSLog(@"%d IS EQUAL", i);
return;
}
}
}