我正在尝试设置一个撤消组,该组覆盖平移手势识别器期间发生的所有更改。正在修改的对象是核心数据中的NSManagedObjects。
当手势进入"开始"阶段时,代码将启动一个撤消组并关闭按事件分组。在"结束"one_answers"取消"阶段,组结束,按事件分组重新打开
识别器每次"更改"时,都会更新相同的核心数据对象。随后,Core Data为该特定更改创建一个新的撤消组。
有什么方法可以让我获得核心数据来阻止这种情况吗?或者,在这种情况下,我需要更改撤消的处理方式吗?
我在这里有一个示例项目,它在BBQMainViewController.m的handlePanGesture:方法中有相关的代码(第82行)。每次更新识别器时,项目都会将撤消堆栈打印到控制台。正如您所看到的,undo堆栈构建和构建。如果注释掉第168行,则撤消堆栈不会建立。
既然在手势识别器循环中每次都要修改相同的NSManagedObject
(好吧,无论如何,在最后的else
子句中),为什么不缓存该值并在UIGestureRecognizerStateEnded
处只设置一次对象的值呢?
无论您的setGroupsByEvent:
设置如何,Core Data可能会为每个更改(至少对图形中的同一对象)显式地创建一个新的撤消组级别(我还不是足够的Core Data专家)。
事实证明,我看到的问题实际上是由我正在开发的应用程序在撤消后没有正确更新UI引起的。
当手势开始时创建一个撤消组,然后在结束或取消状态时关闭它,将包装核心数据在重新设置程序的更改状态更新期间创建的所有撤消组。对撤消管理器的撤消调用将撤消整个组,包括Core Data创建的嵌套组。
简而言之:用户错误。和往常一样。