找到NSUndoManager正在执行的对象

时间:2012-03-27 22:32:36

标签: iphone ios xcode

在我的应用中,用户可以快速在对象之间来回切换,并编辑这些对象上的文本。

当他们按“撤消”时,我想调出相关对象,以便他们可以看到他们正在执行的撤消。

对象是NSManagedObject子类的实例,我正在使用创建managedObjectContext时获得的UIManagedDocument附带的撤消管理器。

撤消& redo运行正常。

如何确定给定撤消操作的哪个对象“撤消”?

1 个答案:

答案 0 :(得分:1)

所以我想出来了。我需要的方法是:

  • (无效)awakeFromSnapshotEvents:(NSSnapshotEventType)标志

可以在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;
      }
   }
}