gpt4 book ai didi

ios - 自动保存不适用于 UIManagedDocument 上的 NSUndoManager

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:22:41 24 4
gpt4 key购买 nike

决议

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

真的有点难过,因为 NSUndoManager 比子上下文更容易实现(对于后者我必须调用 existingObjectWithID 将对象从父上下文复制到 child - 痛苦)。如果 groupingLevel != 0,我个人认为文档不应该自动保存。吐槽完毕。

原始问题

我有一个 TableView Controller ,它使用 Core Data 将数据加载到 UIManagedDocument 中。它转到一个 View Controller 来编辑表中的每一行。在那个 View Controller 中,我有取消和保存按钮。我正在通过我的 NSManaged 对象(下面的 self.list)上的一个类别使用 NSUndoManager 实现取消功能。

- (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];
}

该类别实现了 beginEditendEditcancelEdit,旨在处理 NSUndoManager 内容。在下面的代码中,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 时单击 Home 按钮,我可以看到 Core Data 调试消息显示它正在提交更改。但是,使用 useUndo = YES,当我单击主页按钮时它不会自动保存。我已经等了几分钟,它仍然没有自动保存。有什么方法可以强制自动保存吗?

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

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

最佳答案

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

关于ios - 自动保存不适用于 UIManagedDocument 上的 NSUndoManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15216273/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com