gpt4 book ai didi

ios - 核心数据撤消/重做 - 操作取决于撤消的内容

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:23:51 25 4
gpt4 key购买 nike

我的 iPad 应用程序(一个 OpenGL 绘图应用程序)中有一个有点复杂的数据模型,我正在努力实现撤消/重做功能。我喜欢 Core Data 可以免费撤消数据模型更改这一事实,但我不知道内置功能对我来说是否足够。

我见过很多在绘图应用程序中实现撤消/重做的示例,但是它们通常执行以下操作:

  1. 告诉托管对象上下文撤消
  2. 根据更改后的数据模型重绘页面上的所有内容

这是非常低效的 - 在我的应用程序中,我需要能够根据正在“撤消”的特定对象执行撤消操作,这通常意味着只刷新 Canvas 的一部分。

所以我的问题是:我可以注册自己的撤消操作并将其与内置撤消结合使用吗?例如,假设我在用户画线时执行以下操作:

- (void)drawLineFromPoint:(CGPoint)startPoint toPoint:(CGPoint)endPoint
{
// Register the undo operation.
[[[managedObjectContext undoManager] prepareWithInvocationTarget:self]
removeObjectWithIndex:nextObjectIndex];

// Draw the line object.
[self drawLineObjectWithIndex:nextObjectIndex fromPoint:startPoint toPoint:endPoint];

// Save the new object to the data model.
[MyCoreDataHelper saveLineObjectWithIndex:nextObjectIndex fromPoint:startPoint toPoint:endPoint];

nextObjectIndex++;
}

当我要撤消此操作时,是否会触发调用并且模型会适当更改?或者这种情况是否需要我放弃内置的托管对象上下文撤消系统并仅使用 NSUndoManager 来滚动我自己的撤消系统,包括自己删除和编辑数据模型?除非我能说出内置撤消/重做实际上是在撤消什么,否则看起来这可能会变得非常困惑和复杂......

编辑:我怀疑(如果上述想法可行)我需要将其包装到撤消组中,以便我注册的撤消操作将与数据模型更改分组?

另一个编辑:另外,我可以保证撤消操作的执行顺序吗?换句话说,如果我在保存核心数据更改并注册我的撤消操作后调用 undo,我能否确保在调用我的撤消操作之前恢复已删除的实体?

最佳答案

Do you know then if it is possible to identify what data was changed from the undo?

你为什么不检查 NSManagedObjectContext 的通知 (Apple Docs)

具体查看通知的 userInfo 以及键 NSInsertedObjectsKeyNSUpdatedObjectsKeyNSDeletedObjectsKey

Also, can I guarantee the order in which undo actions will be carried out?

好吧,撤消是通过堆栈(后进先出)进行的,因此您“应该”能够跟踪您的步骤。显然,如果您希望事情正确展开,您必须非常具体地记录撤消的顺序。几行代码帮助我跟踪撤消堆栈,以了解神秘面纱背后的内容:

id undoStack, redoStack;
object_getInstanceVariable(undoManager, "_undoStack", &undoStack);
object_getInstanceVariable(undoManager, "_redoStack", &redoStack);
NSLog(@"%@", [undoStack description]);
NSLog(@"%@", [redoStack description]);

(Props to this site for the above code)

关于ios - 核心数据撤消/重做 - 操作取决于撤消的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8905548/

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