问题标签 [nsundomanager]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
5214 浏览

iphone - 撤消在 UITextView 中的输入

我正在使用 iPhone SDK 3.0。

比如说,我通过在我的应用程序委托中设置application.applicationSupportsShakeToEdit为启用“摇晃撤消” 。YES我在 RootViewController 中创建了一个 UITextView,并让它在应用启动时成为第一响应者。

我用来- (BOOL)textView:(UITextView *)aTextView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text根据用户键入的内容来更改文本视图。问题是它搞砸了默认的撤消操作。摇动设备不再显示“撤消键入”。

我尝试自己创建一个撤消管理器,但尚未成功。即使我让撤消管理器注册了一些操作,当我摇动我的设备时也没有任何显示prepareWithInvocationTarget

有人有想法吗?

编辑:我检查了 iPhone 的 WriteRoom 行为以及 TextExpander Touch SDK 示例代码,它们都在摇动时显示 Undo 选项,直到自动完成。也就是说,当通过 setText: 向 textView 提交更改时,我猜。所以,改变 textView 的内容确实对 undo 机制有一些影响。

编辑 2:问题是:在这种情况下,我如何合并撤消功能?

0 投票
1 回答
603 浏览

nsundomanager - NSUndoManager 的问题

我阅读了 Hillegass 书中有关撤消/重做的章节。不过,他只讨论了基于文档的应用程序。我使用的代码与书中几乎相同,但是当我使用下面的代码时,我得到“appController 可能无法响应 -undoManager”。我知道我必须明确地创建一个撤消管理器,但我究竟该怎么做。请给我一步一步的解释。谢谢。

-(void)insertObject:(Accounts *)currentAccount inArrayOfAccountsAtIndex:(int)index { NSLog(@"添加 %@ 到 %@", currentAccount, arrayOfAccounts);

0 投票
3 回答
5113 浏览

iphone - NSUndoManager undo 不使用核心数据

我正在尝试创建一个 iPhone 应用程序,用户可以在其中添加条目。当他按下一个新条目时,会弹出一个框询问他一些信息。然后他可以按“取消”或“保存”来丢弃数据或将其保存到磁盘。

为了节省,我使用了 Core Data 框架,它工作得很好。但是,我无法让“取消”按钮工作。当弹出窗口询问信息时,我在托管对象上下文 (MOC) 中创建一个新对象。然后当用户按下取消时,我尝试使用属于 MOC 的 NSUndoManager。

我也想使用嵌套的撤消组来做到这一点,因为可能有嵌套组。

为了测试这一点,我编写了一个简单的应用程序。该应用程序只是启用了 Core Data 的“基于窗口的应用程序”模板。对于核心数据模型,我创建了一个名为“Entity”的实体,其整数属性为“x”。然后在 applicationDidFinishLaunching 中,我添加以下代码:

这个想法很简单。尝试插入一个新的 Entity 对象,撤消它,获取 MOC 中的所有 Entity 对象并将它们打印出来。如果一切正常,最后应该没有对象。

但是,我得到这个输出:

如您所见,在我尝试撤消其创建后,该对象存在于 MOC 中。关于我做错了什么的任何建议?

0 投票
3 回答
1382 浏览

core-data - 带有核心数据的 NSUndoManager - 重做不起作用

我有一个基于核心数据文档的应用程序,它通过与 NSManagedObjectContext 关联的内置 NSUndoManager 支持撤消/重做。我设置了一些动作,它们在 Core Data 中执行大量任务,通过beginUndoGrouping/将所有这些任务包装到一个撤消组endUndoGrouping中,并由 NSUndoManager 处理。

撤消工作正常。我可以执行几个连续的操作,然后依次撤消每一个操作,并且我的应用程序的状态得到正确维护。但是,永远不会启用“重做”菜单项。这意味着 NSUndoManager 告诉菜单没有要重做的项目。

我想知道为什么 NSUndoManager 似乎在撤消项目后会忘记它们,并且不允许重做?

我应该提到的一件事是,我在打开/创建文档后禁用撤消注册。当我执行一个动作时,我调用enableUndoRegistration, beginUndoGrouping,执行该动作,然后调用processPendingChanges, setActionName:, endUndoGrouping,最后调用disableUndoRegistration。这确保只有特定的操作是可撤消的,并且我在这些之外所做的任何其他数据更改都不会被 NSUndoManager 注意到。这可能是问题的一部分,但如果是这样,我想知道为什么它会影响重做?

提前致谢。

0 投票
1 回答
635 浏览

cocoa - 文本视图的多个撤消管理器

我有一个文本视图,它从存储在模型对象中的属性字符串中获取其内容。我在抽屉中列出了其中几个模型对象,当用户单击其中一个时,文本视图会交换其内容。

我现在还需要将撤消管理器换成文本视图。我在我的模型对象上初始化了一个撤消管理器,并使用 undoManagerForTextView 将其返回到文本视图,但有些地方不太对劲。

策略性放置的日志语句向我展示了一切都按计划进行:在启动时,一个新的模型对象被正确初始化,并且文本视图总是拉出一个非空的撤消管理器。但是当谈到实际撤消时,我就是无法获得我想要的行为。

我打开一个窗口,输入一些内容并按 cmd+z,然后撤消操作。我打开一个窗口,输入一些东西,在桌子上选择一个新模型,输入一些东西,回到第一个模型并尝试撤消,我得到的只是一声哔哔声。

文档中的某些内容让我大吃一惊,因为这意味着我无法对多个模型对象进行撤消:

只要字段或单元格是第一响应者(即键盘操作的焦点),默认的撤消和重做行为就适用于文本字段和单元格中的文本。一旦插入点离开字段或单元格,之前的操作将无法撤消。

0 投票
1 回答
365 浏览

iphone - Serialize state data from NSUndoManager on iPhone

I've got undo/redo set up in my iphone app, and now I'm looking at saving state, so when the user exits the app and then starts it up again, everything is in the same state, including the undo/redo stack. I don't see any obvious way to serialize the NSUndoManager. Is there a good way to accomplish this?

0 投票
2 回答
1981 浏览

iphone - 在 iPhone SDK 中使用 NSUndoManager 撤消/重做

我一直在尝试使用 NSUndoManager 类在我的一个应用程序中设计撤消/重做功能并看到一些设计困难。在我的应用程序中,我只有一种方法

因此,当用户在 UI 中选择一个按钮时,我将一个球对象添加到我的数组列表中。但是,我没有任何移除球的操作按钮,这是 UI 工作流程的设计,无法更改。因此,为了实现撤消,我在 addLastBall 方法中调用了以下代码

完成此操作后,当用户尝试执行撤消操作时,将使用球对象调用 removeBall 方法。现在一切都很好。但是,我现在不确定如何处理重做部分,当用户尝试重做时,我不确定会调用哪个方法,因为我需要添加用户刚刚使用撤消操作删除的球对象。任何见解都会非常有帮助。

非常感谢。

0 投票
2 回答
655 浏览

core-data - 跨多个运行循环周期的操作的核心数据撤消合并

我有一个基于核心数据的 UIKit 应用程序,它允许用户在屏幕上拖动对象。在拖动对象时,我会在每个touchesMoved:事件上更新其位置属性。为了支持一次性撤消拖动操作,我在拖动开始时启动了一个新的撤消组,并在用户抬起手指时结束该组。

为了节省内存并使撤消操作快速,我想合并属于拖动操作的撤消数据,但 Core Data 使这变得困难。问题是processPendingChanges在每个运行循环周期结束时调用它,它会强制 Core Data 为该迭代中发生的位置更改归档一个新的撤消记录。一个拖拽操作可以很容易地累积数百条这样的撤销记录,除了第一个之外,所有这些都是不必要的。

有没有办法让我继续使用 Core Data 神奇的内置撤消支持,但又不会在重复的撤消记录上浪费宝贵的内存?我喜欢我不需要关心在撤消/重做操作之间维护对象图的一致性,但无法正确处理这些连续的属性更新似乎是一个阻碍。

0 投票
2 回答
825 浏览

objective-c - Is it possible to implement mutliple NSUndoManager for one NSWindow?

I have a window with multiple views (they all subclass NSView and there is always only one visible) on which i draw paths. I'd like to have an NSUndoManager for each view, but obviously they all have the same NSUndoManager, coming from the NSWindow.

Is this even possible?

Thx xonic

0 投票
2 回答
289 浏览

objective-c - 获取 isDocumentEdited 的通知

是否可以绑定/获取 NSDocument 的 isDocumentEdited 属性的通知,而无需在每次更改时调用 will/didChangeValueForKey: 方法?