撤消管理器未与 NSPersistentDocument 保持同步

Posted

技术标签:

【中文标题】撤消管理器未与 NSPersistentDocument 保持同步【英文标题】:Undo manager not up to date with NSPersistentDocument 【发布时间】:2011-10-09 15:18:36 【问题描述】:

我在核心数据数据库中有一些计算值,我需要在保存之前对其进行更新。基本上我对一些实体进行编号以简化它们之间的导航。

目前我正在观察NSManagedObjectContextWillSaveNotification 并尝试在那里进行此编号。我所做的更改似乎已保存,但撤消管理器似乎仍有一些修改。即使托管对象上下文表明它没有(hasChanges),这也会使文档看起来像是发生了变化(关闭按钮上的标记)。如果我撤消一次,文档看起来没有任何变化,但托管对象上下文却反过来。

撤消管理器是否以某种方式将自身重置在错误的位置,还是我做错了什么?

更新

我在其中进行重新编号的有点混淆的代码如下所示:

- (void)managedObjectContextWillSave:(NSNotification *)notification

    // Force the content view controller to save any pending changes.
    [_contentViewController saveChanges];

    NSArray *itemSortDesc = [self sortDescriptorsForSomeItem];
    NSArray *items = [SomeItem findAllObjectsInContext:self.managedObjectContext
                                             andSortBy:itemSortDesc];
    NSUInteger i = 0;
    for (SomeItem *i in items)
    
        i.uid = [NSNumber numberWithUnsignedInteger:i++];
    

_contentViewController 包含一个文本字段,该字段将被解析为多个 SomeItem 实例。

【问题讨论】:

您能发布处理该事件的代码吗? 【参考方案1】:

我猜你的编号会影响撤消堆栈。

我可能会尝试在NSManagedObject willSave 中处理此问题,而不是使用NSManagedObjectContextWillSaveNotification,但我怀疑这不会解决您的问题。

你可以试试这个:

[[self.managedObjectContext undoManager] disableUndoRegistration];

// do the renumbering

[self.managedObjectContext processPendingChanges];
[[self.managedObjectContext undoManager] enableUndoRegistration];

我使用它来避免在初始化期间弄脏全新的文档。我不确定它是否能正常保存,但可能值得一试。

【讨论】:

这行得通,谢谢。但是,由于某种原因,保存后会有一两个空的撤消步骤,但我认为这可能与重新编号有关,因为在任何情况下都会重新计算项目的 uid,即使它没有改变。我想我会考虑在文本字段解析后立即重新编号。

以上是关于撤消管理器未与 NSPersistentDocument 保持同步的主要内容,如果未能解决你的问题,请参考以下文章

电脑老是说资源管理器未响应是怎么了

电脑文件夹右击导致window资源管理器未响应?

SDK 管理器未从 Eclipse 打开

片段 XXX 未与片段管理器关联

警报管理器未正确安排警报

windows7资源管理器未响应,发生以下错误,怎么解决?