- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 [undoManager registerUndoWithTarget::] 向撤消堆栈添加一些更改。然而,有时会发生,当在一个运行循环周期中将两个更改添加到同一组时,它们会立即恢复,这不是我想要的行为。我想将这两个更改分开,以便在撤消堆栈中有两个项目。如何正确实现呢?使用 [NSObject performSelector: ] 在下一个运行循环周期中调用第二个撤消添加,或者其他什么?
谢谢。
最佳答案
正如您所注意到的,默认情况下 NSUndoManager
会自动将撤消操作分组在一个运行循环周期中。不过,您可以更改该行为:如果您发送 NO
参数,-[NSUndoManager setGroupsByEvent:]
将禁用自动分组。请注意,您需要确保在撤消管理器执行 -undo
或 -undoNestedGroup
之前关闭所有组。由于其他 Cocoa 类可能希望在不显式创建组的情况下注册撤消操作,因此您可以在注册撤消组之前禁用自动分组,在注册这些组后重新启用。
例如:
- (void)someMethod {
NSUndoManager *undoManager = …; // for example, [[self window] undoManager]
[undoManager setGroupsByEvent:NO];
{
[undoManager beginUndoGrouping];
{
[undoManager registerUndoWithTarget:modelObject selector:@selector(setString1:) object:[modelObject string1]];
[modelObject setStringValue:newValue1];
[undoManager setActionName:@"String 1 Change"];
}
[undoManager endUndoGrouping];
[undoManager beginUndoGrouping];
{
[undoManager registerUndoWithTarget:modelObject selector:@selector(setString2:) object:[modelObject string2]];
[modelObject setString2:newValue3];
[undoManager registerUndoWithTarget:modelObject selector:@selector(setString3:) object:[modelObject string3]];
[modelObject setString3:newValue3];
[undoManager setActionName:@"Strings 2 and 3 Change"];
}
[undoManager endUndoGrouping];
}
[undoManager setGroupsByEvent:YES];
}
在-someMethod
中,对modelObject
应用了三个变化,修改了它的string1
、string2
和string3
属性。应用于 string1
的更改是撤消组的一部分,对 string2
和 string3
的更改是另一个撤消组的一部分。这两个组都包含在一个 block 中,其中撤消管理器不会将当前运行循环周期的默认撤消组中的所有操作分组。执行此方法后,第一个撤消操作撤消 string2
和 string3
更改,随后的撤消操作撤消应用于 string1
的更改,前提是不是另一个包含它们的撤消组。
我使用 C block {}
来使这两个层次结构(没有按事件分组和撤消组)变得清晰。
注意:NSUndoManager
不是线程安全的。
关于objective-c - NSUndoManager : separate multiple changes in one run loop cycle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16763716/
我正在尝试创建一个 iPhone 应用程序,用户可以在其中添加条目。当他按下新条目时,会弹出一个框,询问他一些信息。然后他可以按“取消”或“保存”来放弃数据或将其保存到磁盘。 为了保存,我使用了 Co
如何在使用 prepareWithInitationTarget 时设置与设置撤消操作相同的特定重做操作 使用我的方法,重做不起作用(撤消有效) - (void)removeSmth:(Smth *)
以下是启用撤消功能的代码,摘自 Aaron Hillegas 所著的《cocoaprogramming for OS X》一书: -(void)removeObjectFromEmployeesAtI
我正在编写一个基于非NSDocument的应用程序,其风格类似于AddressBook.app。它有一个位于 MainMenu.nib 中的窗口。 目前,我正在努力将 NSUndoManager 与此
我有一个复杂的情况,我有一个 View Controller 和几个 subview Controller 。 情况A:当我更改 subview Controller 时,我将更改记录在NSUndoM
当值是引用类型时,我无法理解 NSUndoManager 如何捕获值。每当尝试使用 undoManager 时,这些值都不会撤消。 注意:我需要支持 macOS 10.10,我使用的是 Swift 3
我有一个应用程序,我想在每次更改之前保存项目的当前状态,以便撤消和重做能够在这些状态中来回切换。当我更改保存位置的代码时: if(!undoManager){ undoManager = [[
我正在尝试将撤消/重做功能集成到 UITextView(我正在构建一个 LateX 编辑器)中,但没有成功,老实说,我对这个论点真的很困惑。我不明白这两个操作涉及的步骤,我的意思是我需要两种方法 删除
核心数据支持开箱即用的撤消/重做。但它的表现出乎意料。 为了使我的用户界面与我的模型保持同步,我发送了通知。我的用户界面收到通知消息并更新受影响的 View 。 @objc(Entity) class
我有一个 NSView 对象,它接收 mouseDragged 事件,该事件会更改在其各自 View 中绘制的对象的位置。然后,在我的 NSViewController 类中,它检索该新位置并将该新值
我想了解/复制NSUndoManger的“按运行循环传递/循环分组”功能:当在同一运行循环周期中多次调用时, NSUndoManager 可以将对 registerUndo() 的多次调用分组为单个“
我注意到如果我说类似的话 [self.undoManager setActionName: @"X & Y"]; 然后生成的菜单项看起来像“撤消 X Y”(X 和 Y 之间有一个双倍空格)。 (在 M
我正在开发一个核心数据应用程序,该应用程序具有相当大的托管对象层次结构,类似于树。 当创建一个基础对象时,它会创建一些子对象,这些子对象又创建自己的子对象,依此类推。这些子对象中的每一个都可以使用 N
我有一个与部门具有多对一关系的托管对象 Employee。因此,一个员工可以在一个部门中,但部门可以包含多个员工。 我使用撤消管理器来注册某些员工的删除。之后我关闭撤消注册我删除部门。部门删除会删除所
我有一个应用程序,它允许用户上下移动 UIView,使一个 View 看起来可以在另一个 View 之上。通过使用 exchangeSubviewAtIndex 方法更改父 View 中 UIView
在我的应用中,用户能够在对象之间快速来回切换并编辑这些对象上的文本。 当他们按下“撤消”时,我想调出相关对象,以便他们可以看到他们正在执行的撤消。 这些对象是 NSManagedObject 子类的实
我不仅需要将更改保存到本地核心数据中,还需要保存到服务器上。 我担心的是,就我而言,用户可以在短时间内进行大量交互。交互之间没有足够的时间接收服务器返回的成功消息。因此,要么我锁定 GUI,直到下一条
NSUndoManager 将发生在同一个运行循环中的调用组合在一起。 我想加载一个包含撤消历史记录的文档。 因此,我创建了一个文档并一个一个地应用调用,但是这些调用都非常快速地添加,导致一次撤消。
我有一些简短的 iOS Objective-C 示例代码(从一个较大的项目中简化而来)导致 NSUndoManager 崩溃,我无法解释。 即,当一个对象仅由 NSUndoManager 持有时 de
我正在尝试在使用 GLKit 的 iOS 应用程序中支持撤消/重做. 当我尝试以下操作时: GLKVector3 currentTranslation = _panningObject.transla
我是一名优秀的程序员,十分优秀!