- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我已经对 Cocoa 进行了几个月的修补,并且正在尝试向我正在编写的一个严格用于学习目的的 Cocoa 应用程序添加撤消/重做支持,该应用程序允许您调整 iTunes 轨道元数据。多亏了 NSUndoManager 的 prepareWithInvocationTarget:
方法,我有了基础知识 — 例如,您可以撤消/重做对所选轨道的播放次数和上次播放日期的更改。 (我正在使用 appscript-objc 来获取/设置 iTunes 轨道数据。)
然而,由于更新大量 iTunes 轨道可能需要一些时间,我想让用户能够在正在进行的过程中取消撤消/重做操作,但我没有看到明显的机制用 NSUndoManager 完成这个。我该怎么做呢?
编辑:
澄清一下,再考虑一下,我想我真正想要的是一种操纵撤消/重做堆栈的方法,这样我就可以避免 Rob Napier 在他的回答中提到的“不一致状态”。
因此,为了响应未进行任何更改而失败的撤消操作(例如,在调用撤消之前,用户打开了 iTunes 的“偏好设置”窗口,这阻止了 Apple Events),撤消操作可以保留在顶部撤消堆栈,重做堆栈将保持不变。如果操作在中途被取消或失败,那么我想将一个操作推到重做堆栈上,该操作会反转经过的更改(如果有的话),并在撤消堆栈顶部执行一个应用未应用更改的操作成功。我认为在撤消和重做堆栈之间有效地拆分操作可能会引起用户混淆,但这似乎是处理该问题的最宽容的方式。
我怀疑对此的答案可能是“编写你自己该死的撤消管理器”、“你的撤消操作不应该失败”或“你不必要地过度复杂化”之一,但我很好奇。 :)
最佳答案
这是您的代码的问题,而不是 NSUndoManager
的问题。无论您请求 NSUndoManager
调用什么方法,都需要具有中断功能。这与最初执行时取消操作没有什么不同(事实上,它应该尽可能是相同的代码)。有两种常见的方法可以实现这一点,使用或不使用线程。
在线程的情况下,您在后台线程上运行撤消操作,并在每个循环中检查一个 BOOL,例如 self.shouldContinue。如果它曾被设置为 false(通常由其他线程设置),那么您将停止。
在没有线程的情况下实现这一点的类似方法是这样的:
- (void)doOperation
{
if ([self.thingsToDo count] == 0 || ! self.shouldContinue)
{
return;
}
id thing = [self.thingsToDo lastObject];
[self.thingsToDo removeLastObject];
// Do something with thing
[self performSelector:@selector(doOperation) withObject: nil afterDelay:0];
}
这里的一个主要问题是此取消将使您的撤消堆栈处于不确定状态。由你来处理。同样,这与您创建撤消项时的初始情况没有什么不同。不管你如何处理中断,你应该如何在撤消期间处理中断。它们通常不是不同类型的操作。
关于objective-c - 如何取消正在进行的撤消/重做操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1634709/
我遵循了一本名为“Sitepoint Full Stack Javascript with MEAN”的书中的教程,我刚刚完成了第 6 章,应该已经创建了一个带有“数据库”的“服务器”。数据库只不过是
在 Jquery 中,我创建两个数组,一个嵌入另一个数组,就像这样...... arrayOne = [{name:'a',value:1}, {name:'b',value:2}] var arra
这个问题在这里已经有了答案: What is the explanation for these bizarre JavaScript behaviours mentioned in the 'Wa
我被放在别人的代码上,有一个类用作其他组件的基础。当我尝试 ng serve --aot(或 build --prod)时,我得到以下信息。 @Component({ ...,
我正在测试一些代码,并使用数据创建了一个 json 文件。 问题是我在警报中收到“[object Object],[object Object]”。没有数据。 我做错了什么? 这是代码:
我想打印 [object Object],[object Object] 以明智地 "[[{ 'x': '1', 'y': '0' }, { 'x': '2', 'y': '1' }]]"; 在 ja
我有一个功能 View ,我正在尝试以特殊格式的方式输出。但我无法让列表功能正常工作。 我得到的唯一返回是[object Object][object Object] [object Object]
在使用优秀的 Sim.js 和 Three.js 库处理 WebGL 项目时,我偶然发现了下一个问题: 一路走来,它使用了 THREE.Ray 的下一个构造函数: var ray = new THRE
我正在使用 Material UI 进行多重选择。这是我的代码。 {listStates.map(col => (
我的代码使用ajax: $("#keyword").keyup(function() { var keyword = $("#keyword").val(); if (keyword.
我遇到了下一个错误,无法理解如何解决它。 Can't resolve all parameters for AuthenticationService: ([object Object], ?, [o
我正在尝试创建一个显示动态复选框的表单,至少应选中其中一个才能继续。我还需要获取一组选中的复选框。 这是组件的代码: import { Component, OnInit } from '@angul
我正在开发 NodeJs 应用程序,它是博客应用程序。我使用了快速验证器,我尝试在 UI 端使用快速闪存消息将帖子保存在数据库中之前使用闪存消息验证数据,我成功地将数据保存在数据库中,但在提交表单后消
我知道有些人问了同样的问题并得到了解答。我已经查看了所有这些,但仍然无法解决我的问题。我有一个 jquery snipet,它将值发送到处理程序,处理程序处理来自 JS 的值并将数据作为 JSON 数
我继承了一个非常草率的项目,我的任务是解释为什么它不好。我注意到他们在整个代码中都进行了这样的比较 (IQueryable).FirstOrDefault(x => x.Facility == fac
我只是在删除数组中的对象时偶然发现了这一点。 代码如下: friends = []; friends.push( { a: 'Nexus', b: 'Muffi
这两个代码片段有什么区别: object = nil; [object release] 对比 [object release]; object = nil; 哪个是最佳实践? 最佳答案 object
我应该为其他人将从中继承的第一个父对象传递哪个参数,哪个参数更有效 Object.create(Object.prototype) Object.create(Object) Object.creat
我在不同的对象上安排不同的选择器 [self performSelector:@selector(doSmth) withObject:objectA afterDelay:1]; [self per
NSLog(@"%p", &object); 和 NSLog(@"%p", object); 有什么区别? 两者似乎都打印出一个内存地址,但我不确定哪个是对象的实际内存地址。 最佳答案 这就是我喜欢的
我是一名优秀的程序员,十分优秀!