3

解析度

NSUndoManager只能在孩子中NSManagedObjectContext使用(与 Core Data 一起使用时)。这是因为它UIManagedDocument可能会在任何时间点自动保存,之后undo将不起作用。因此,仅仅实现保存/取消功能是没有意义NSUndoManager的,因为子上下文会给你相同的结果。

真的有点难过,因为NSUndoManager它比子上下文更容易实现(对于后者,我必须调用existingObjectWithID将对象从父级复制到子级 - 很痛苦)。我个人认为如果groupingLevel != 0. 吐槽完了。

原始问题

我有一个表视图控制器,它使用 Core Data 将数据加载到UIManagedDocument. 它使用视图控制器来编辑表格中的每一行。在那个视图控制器中,我有取消和保存按钮。我正在通过我的对象NSUndoManager上的一个类别(如下)来实现取消功能。NSManagedself.list

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.list beginEdit];
}

- (IBAction)cancel:(id)sender
{
    [self.list cancelEdit];
    [self close];
}

- (IBAction)save:(id)sender
{
    [self.list endEdit];
    [self close];
}

类别 implements beginEdit,旨在处理 NSUndoManager 的东西endEditcancelEdit在下面的代码中,useUndo我将其设置为 NO 或 YES 以查看使用 NSUndoManager 的影响。

- (void)beginEdit
{
    if (useUndo)
    {
        NSUndoManager *undoManager = [[NSUndoManager alloc] init];
        self.managedObjectContext.undoManager = undoManager;
        [undoManager beginUndoGrouping];
    }
}

- (void)endEdit
{
    [self.managedObjectContext save:nil];
    if (useUndo)
    {
        NSUndoManager *undoManager = self.managedObjectContext.undoManager;
        [undoManager endUndoGrouping];
        self.managedObjectContext.undoManager = nil;
    }
}

- (void)cancelEdit
{
    if (useUndo)
    {
        NSUndoManager *undoManager = self.managedObjectContext.undoManager;
        [undoManager endUndoGrouping];
        [undoManager undo];
    }
}

如果我保存一个对象并在useUndo = NO. 但是,useUndo = YES当我单击主页按钮时,它不会自动保存。我已经等了几分钟,它仍然没有自动保存。有什么办法可以强制自动保存吗?

谁能解释为什么使用 undoManager 会导致这种行为变化?

我怀疑我的处理方式错误,或者代码中有一些简单的问题。任何帮助,将不胜感激。

4

1 回答 1

1

我不确定它是否正确,但 stackoverflow 上的其他答案提到 NSUndoManager 在上下文保存时清除撤消堆栈。这意味着使用具有自动保存功能的撤消管理器最多可以使用几秒钟(无论自动保存间隔是多少)。那里可能有联系,我正在尝试找出更多...

于 2013-08-09T13:10:40.163 回答