使用 CoreData 嵌套撤消组

2024-02-06

我想将撤消管理器添加到 coredata 支持的 iPhone 应用程序中。当用户尝试添加新对象(通过点击 + 按钮)时,我加载一个新的模式视图控制器并在 viewDidLoad 中启动一个新的撤消组。

当用户按下“取消”按钮时,我想回滚 cancelAction 回调中的更改。

Queries:

  1. 是否可以启动一个嵌套的撤消组并通过事件循环保留它并整理在一个撤消组中完成的所有更改?现在,当我在 cancelAction 中调用 beginUndoGrouping 时,我收到丢失的 beginUndoGrouping 异常。
  2. groupsByEvent API 对于 NSUndoManager 有什么意义?我是否需要将其设置为“否”才能通过事件循环保留撤消组?
  3. 在 saveAction 回调中需要做什么才能使更改永久化(除了在 mangedObjectContext 上调用 save 之外)?如何告诉撤消管理器停止跟踪更改?

错误信息:

*由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“_endUndoGroupRemovingIfEmpty:: NSUndoManager 0x75415f0 处于无效状态,调用 endUndoGrouping 且没有匹配的开始”

示例代码:

// RootViewController.m
- (void) addAction {
   // Load Modal View Controller to add new object

}

// AddViewController.m
- (void) viewDidLoad {
   // Start nested undo group
   [self.managedObjectContext processPendingChanges];
   [self.managedObjectContext.undoManager beginUndoGrouping];

   [self createModel];

}

- (void) cancelAction {
    // Revert all changes
    [self.managedObjectContext processPendingChanges];
    [self.managedObjectContext.undoManager endUndoGrouping];

    [self.managedObjectContext.undoManager undoNestedGroup];

    ...
}

- (void) saveAction {

    // Save changes
}

从您的具体问题开始 - 是的,您可以使用 beginUndoGrouping 和 endUndoGrouping 手动定义撤消操作的范围。

在这种情况下,无论是否设置 groupsByEvent,撤消操作都应该有效。这是因为事件循环生成的所有撤消组都嵌套在以 beginUndoGrouping 开始的主打开撤消分组下,并且只要在调用 endUndoGrouping 后直接调用 undoNestedGroup ,它就应该可以工作。如果您不使用事件循环撤消分组,请不要担心并将其设置为“否”。

要使更改永久化,请使用 endUndoGrouping 关闭撤消组并在上下文中调用 save。不需要 processPendingChanges 调用,并且可能会导致嵌套组出现问题。如果您想清除撤消操作,请在 endUndoGrouping 之后在撤消管理器上调用removeAllActions - 这保证了更改永远不会被撤消。

使用断点/nslog 确保您的开始/结束调用是一一对应的。

如果您希望取消操作像“撤消按钮”一样,则必须执行以下操作:

  • 将 beginUndoGrouping 移至 viewWillAppear

  • 在 viewWillDisappear 中调用 endUndoGrouping

  • 在取消操作结束时重新打开撤消分组

  • 在保存操作结束时重新打开撤消分组

否则,如果您保持原样,请确保在保存和取消操作中关闭对话框,以避免多次调用 endUndoGrouping 的可能性。

如果有任何疑问,请评论,我会更新。

祝你好运!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 CoreData 嵌套撤消组 的相关文章

  • Firebase FCM 推送通知停止工作 iOS 11.1.1

    我正在使用 Firebase FCM 从 iOS 设备发送推送通知 直到昨天 推送通知仍然有效 当我现在发送推送通知时 一切都显示成功 但设备上没有收到任何信息 如果我直接通过curl请求发送 这就是响应 multicast id 7815
  • 使用 SceneDelegate 设置 CoreData - 未知标识符“窗口”错误 - iOS 13 及以上版本

    我试图使用核心数据的官方苹果文档 成立here https developer apple com documentation coredata setting up a core data stack 我还遇到了一个与我的问题相关的问题
  • iOS 10.核心数据插入新对象 sigABRT

    我尝试了 forEntityName Game MyApp Game 在我的 dataManagerFile 中 let appDelegate UIApplication shared delegate as AppDelegate le
  • 使用 iPhone 上传视频

    可以将视频上传到服务器吗 我知道图像是可能的 如果有人能指出我正确的方向 那就太好了 Thanks 2015 年 8 月编辑 这个答案现在已经严重过时了 在撰写本文时 选项并不多 而且视频的大小也相对较小 如果您现在正在考虑这样做 我会使用
  • apple mach-o 链接器错误链接器命令失败,退出代码为 1(使用 -v 查看调用)

    2 https i stack imgur com pMAAm png我正在使用 Objective C 处理核心数据 出现错误 Apple Mach O Linker Error Linker command failed with ex
  • 以编程方式从 iPhone 向 WordPress 博客发表评论

    我在本地主机服务器上安装了 WordPress 博客 还制作了一个 iPhone 应用程序来通过 rss 浏览博客 我尝试使用此代码以编程方式发布评论 define post url http localhost web wp wp com
  • iPhone/iPad 应用程序代码混淆 - 有可能吗?值得? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经研究了很多 无论是在 SO 上 还是到处谷歌搜索 但我似乎找不到关于用 Objective C 编写的 iPhone iPad
  • iPhone开发中如何制作画线动画?

    我一直在四处寻找 但对于这个简单的问题似乎没有好的答案 所以我再次问 如何在 iphone dev 中制作线条画动画 基本上我想要的是这样的 implementation MyUIView void triggerLineDrawing C
  • 重新排序单元格后重新加载自定义 UITableViewCell

    I have UITableView它使用自定义UITableViewCells 单元格可以具有三种类型的背景图像之一 在每个单元格的 backgroundView image属性 顶部 中间或底部 顶部和底部图像用于第一个和最后一个单元格
  • 如何在cocos2d for iphone中获取CCSprite的宽度和高度

    这就是问题xD 给定iphone中cocos2d中的CCSprite实例 我可以使用什么方法来获取图像的宽度和高度 CCSprite 类有一个边界框属性 它是 CGRect CCSprite sprite CCSprite spriteWi
  • 现有 UIPopoverController 中的 UIImagePickerController

    有没有办法将 UIImagePickerController 推送到现有 UIPopoverController 的导航控制器中 我所知道的是 您必须创建一个新的弹出窗口并在其中添加 UIImagePickerController 但我有一
  • locationManager:didRangeBeacons 方法未检测到 BLE 设备

    我正在使用 Nordic BLE nRF8001 开发套件来测试 CoreBluetooth 使用 CBCentralManager 的方法 例如 didDiscoverPeripheral didConnectPeripheral 等 我
  • 为 iPhone 创建 .ipa

    我为 iPhone 开发了一款应用程序 构建后 我在构建文件夹中得到了 app 文件 我的应用程序名称是Myapp 然后我在build文件夹中得到了Myapp app文件 我的问题是我想创建 ipa 文件 这是怎么回事 它是为了安装 越狱的
  • iOS 显示 UIImage 全屏并启用缩放(捏合和双击)

    我有一个UIImage从相机捕获UIImagePickerController 现在 在用户单击它之后 我希望它显示全屏 并且能够使用捏合手势进行放大和缩小 还可以使用双击手势来放大特定区域 换句话说 我想模拟ios默认图像浏览器的功能 我
  • 将用户重定向到 iTunes 应用商店或 Google Play 商店?

    我正在寻找一种简单的解决方案来发布我的应用程序的一个链接 例如在 Facebook 上 如果用户使用移动设备访问它 它应该自动重定向到正确的应用程序商店 否则 用户应该被重定向到我的网站 iOS应用程序 http itunes apple
  • scrollToRowAtIndexPath:atScrollPosition:动画滚动太慢

    基于分页 UIScrollView 的页面更改 我正在调用scrollToRowAtIndexPath atScrollPosition animated到所显示的该页面的表详细信息 void scrollViewDidScroll UIS
  • 从 NSString 的第一行删除换行符

    我怎样才能删除第一个 nNSString 中的字符 编辑 只是为了澄清一下 我想做的是 如果字符串的第一行包含 n 字符 请将其删除 否则不执行任何操作 即 如果字符串是这样的 nhello this is the first line n
  • 无限 UIScrollView 在 iOS4.3 中出现奇怪的行为,而不是 iOS5

    我已经实现了一个包含 UIView 的无限 UIScrollView 在 iOS5 模拟器和 iPhone 中滚动时 效果非常好 但在 iOS 4 3 sim 和手机 中 情况有点疯狂 滚动条传递的视图比应有的多 大约比 iOS5 多 10
  • 无法下载应用程序 - 此时无法下载“APP”

    我的应用程序有 PLUS 版本和常规版本 我使用不同的目标对它们进行存档 我将 ipa 上传到 TestFlight 也上传到我的曲棍球服务器 PLUS 版本总是下载得很好 但普通版本总是给我 无法下载应用程序 错误 我根本没有更改两个版本
  • iOS 复合谓词

    我正在编写一个具有照片数据库的应用程序 每张照片都有多个与之关联的标签 并且该应用程序有一个带有大量切换的搜索页面 允许用户仅根据他们感兴趣的标签搜索照片 每个标签都存储了integerID 是因为它们对应于外部数据库的 ID 所以我尝试简

随机推荐

  • Zip Mime 类型无法识别

    我正在尝试返回一个 zip 文件 作为浏览器上的流 这适用于其他类型的文件 例如 Excel 文件 但是当我开始处理 zip 文件时 我无法让浏览器识别出它是 zip 我的测试机上运行的 Firefox 和 IE 都会提示 询问使用什么程序
  • Python UCS2 从十六进制字符串解码

    我正在使用 python 2 7 需要将十六进制字符串解码为 un icode 字符串 在 php 中 我做了以下简单的操作 line hex2bin line finish iconv UCS 2BE UTF 8 nline 例如十六进制
  • 我可以在 android xml 布局或字符串值文件中编写 java 代码吗?

    我想知道是否可以在 android XML 布局或字符串值文件中编写 java 代码 我的意思是这样的
  • 给定3个点,如何构造穿过它们的弧?

    假设我有 3 个连续点 P1 P2 P3 如何构造一条经过所有3个点的弧 弧必须具有以下 3 个属性 开始弧度 结束弧度 中心点 弧线是从Start Radian to End Radian以逆时针方向 我已经尝试过解决方案here htt
  • 东向北转纬度经度

    我有东向 北向格式的位置坐标 但我需要将其转换为正确的经纬度 以使其在 bing 地图中居中 有任何公式或详细信息如何将东距 北距转换为纬度 经度吗 编辑 更具体地说 我需要将 SVY21 坐标转换为 WGS84 东距和北距分别是基点向东和
  • EMR-5.32.0 上的 Spark 未生成请求的执行程序

    我在 EMR 版本 5 32 0 上的 Py Spark 中遇到了一些问题 大约一年前 我在 EMR 集群上运行了相同的程序 我认为版本一定是 5 29 0 然后我可以使用配置我的 PySpark 程序spark submit正确地论证 但
  • 正在验证 MVC 隐藏字段

    我的页面上有一些字段 它们的显示和消失取决于您在页面上所做的下拉选择 所以 举例来说 我有 section Html LabelFor model gt model AuctionTypeId div Html DropDownList A
  • 在我的下一个 Android 应用程序更新中使用新的数据库版本覆盖现有的已发布 Sqlite DB

    我想覆盖旧应用程序版本附带的现有数据库 并在下一个应用程序更新中使用新完全填充的数据库 然而 onUpgrade 永远不会被调用 尽管我尝试在将 DB version 传递给 SQLiteOpenHelper 类时更改它 public cl
  • FTDI 的 libMPSSE 上“遇到 NULL 表达式”

    我的问题是针对 FTDI 的 libMPSSE 库在 Linux 上与 USB 转串口 SPI I2C 等 适配器配合使用的问题 当我执行与该库链接的任何程序时 会调用方法 Init libMPSSE 无需显式调用 并抛出以下消息 Infr
  • 如何在 Python 中的 Opencv Cam 窗口中提供启动、停止、捕获和关闭按钮

    如何在视频捕获窗口中提供开始 停止 捕获和关闭按钮来启动 停止 拍摄快照 关闭窗口 我使用以下代码打开相机进行视频流 import cv2 cv as cv cv NamedWindow camera 1 capture cv Captur
  • 3ds Max .NET SDK 和创建参考制作器

    我有 Net DLL for Max 和 ui 我想对视口中某些节点的参数更改做出反应 我想到的最简单的解决方案是创建 ReferenceMaker 插件并为我想要观看的节点设置参考 根据文档应该是 public class Referen
  • Valgrind 导致长双精度数字问题

    我的代码中有以下函数 用于检查数字是否具有允许的值 在日志空间中 template
  • ASP.NET MVC 3 模型绑定资源

    我正在寻找一个很好的资源 它非常全面地描述了模型绑定如何与 ASP NET MVC 3 或在较小程度上 MVC 2 和不同的方法一起工作 除了零碎的内容之外 我找不到关于这个主题的任何好的资源 网上的信息更多的是关于 如何做 X 而不是解释
  • ASP.NET MVC3 - 您如何处理探测请求?

    我们的网站上线了 当然 我们开始收到大量的探测请求 喜欢 blog wp login php admin admin php etc 所以问题是 你用它们做什么 现在 在每种情况下都会抛出 404 错误 并且 elmah 会发送有关该错误的
  • 为什么我们不能在某个进程上接受()套接字并从其子进程中接收()数据?

    我正在尝试在 Linux 上实现一个简单的 Web 服务器 它连接到客户端 浏览器 接收来自客户端的一些请求 例如 GET 然后用所需的文件发回响应 我正在使用套接字通信 我想在服务器启动时创建一个工作进程 子进程 池 其工作是处理传入的请
  • 如何将肥皂基本身份验证请求添加到 WSDL

    我怎样才能对 WSDL 进行 Soap AUTH BASIC 身份验证 以便阅读 WSDL 的人知道我需要针对特定 方法进行该操作 使用下面的示例 我成功地将 SOAP 基本身份验证传递到另一端的 php Web 服务 PHP net So
  • PHP imageftbbox imagettftext - 简单的字母间距/字距调整?

    有谁知道使用 imagettftext 进行字母间距 字距调整的简单方法 我的脚本按照我现在的需要工作 但我确实可以使用具有 CSS 样式的生成文本 letter spacing 0 01em 所以它与页面上的标准文本相匹配 但我没有看到任
  • 如何选择列表中所有无序的元素?

    这个问题源于评论里的讨论这个答案 https stackoverflow com questions 1390832 how to sort nearly sorted array in the fastest time possible
  • 如何使用executeReader()方法检索一个单元格的值

    我需要执行以下命令并将结果传递给标签 我不知道如何使用 Reader 来做到这一点 有人可以帮我吗 String sql SELECT FROM learer WHERE learer id index SqlCommand cmd new
  • 使用 CoreData 嵌套撤消组

    我想将撤消管理器添加到 coredata 支持的 iPhone 应用程序中 当用户尝试添加新对象 通过点击 按钮 时 我加载一个新的模式视图控制器并在 viewDidLoad 中启动一个新的撤消组 当用户按下 取消 按钮时 我想回滚 can