问题标签 [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 投票
2 回答
2017 浏览

objective-c - 清除 NSUndoManager 的重做堆栈

在我的应用程序中,我想以编程方式撤消一些操作,而不给用户单击“重做”的选项。有没有办法清除重做堆栈NSUndoManager?如果没有,并且我要进行子类NSUndoManager化,有没有办法访问重做堆栈以清除它?我没有从文档中看到任何方法。

或者,有没有办法在不填充重做堆栈的情况下恢复当前嵌套撤消组的更改?我已经在构建一个嵌套的撤消组。

0 投票
1 回答
196 浏览

core-data - 从众多实体中恢复一个获取的实体——核心数据

这个问题涉及我对如何使用核心数据撤消管理器以及如何将 NSManagedObject 恢复到编辑完成之前的状态缺乏了解。

我只是在学习有关 Core Data 的方法。我用动态访问器设置了我的 NSManagedObject 类。我执行一个返回多个 NSManagedObject 实体结果的提取。来自这些实体结果(名字、姓氏)中的每一个的内容都被放入一个表格视图中,然后用户从表格中挑选一个进行详细查看,然后进行编辑。

详细视图控制器接收一个指向所选 NSManagedObject 实体的指针。当用户编辑字段时,NSManagedObject 实体中的相应属性值也会更新。这似乎是管理这些更改的最干净的方法。

现在,我不想使用 save 提交更改,而是想提供一个取消编辑功能,该功能可以回滚到该实体的数据库中的内容。我真的只想恢复一个实体而不执行整个重新获取。

我尝试了回滚并尝试了 NSUndoManager(使用 beginUndoGrouping 和 endUndoGrouping),但这不起作用。我想我不明白回滚到底应该做什么。

但在任何情况下,我仍然希望仅在单个实体中恢复属性值(采用惰性方法仅获取需要的内容,即一个实体),以便我的详细视图控制器可以用正确的信息重新填充其视图. 现在它正在使用 NSManagedObject 实体值,其中包含已取消的已编辑值。

我想我可以通过创建 NSManagedObject 的副本来开始编辑过程。如果按下取消编辑按钮,我可以将其复制回原件。(我什至可以通过移动指针来用副本替换原件。但由于指针实际上已经通过了几个对象,我不确定如何管理副本上的保留编号。)

有没有人有任何其他建议?

谢谢

0 投票
1 回答
412 浏览

objective-c - 使用适当的撤消管理创建不断更新的自定义控件

我正在组合一个通过绑定处理两个值的自定义 NSView。我在更新时传播值,如 Tom Dalling 在问题中您可以手动实现 Cocoa 绑定吗?. 这一切都很好。

为了使控件不断更新,我更新并传播了-mouseDragged方法中的值。同样,这工作正常,但它将中间步骤注册到 NSUndoManager,这是我不想要的。所以,我尝试发出disableUndoRegistrationin-mouseDown然后enableUndoRegistrationmouseUp. 自然我会再次更新和传播结果。

根本没有注册撤消,我意识到这是因为如果值不变,我的 set 函数不会注册撤消:

由于-mouseDragged已经传播了该值,因此在 中再次发送时它没有改变-mouseUp,因此从未记录撤消。我当然希望它撤消到初始值之前的位置-mouseDown,所以假设我通过将该值存储在控件中然后在-mouseUp发送新值之前再次发送该值来执行此操作。当然,这仍然存在问题,我可以看到它一闪而过回到原来的值。

我可以-setX:通过检查撤消管理器是否已启用并跟踪旧值来解决此问题。但是,我应该能够在控件内完成此操作,因为存在具有这种精确行为的控件(例如设置为连续的 NSSlider)。

谢谢!

0 投票
2 回答
280 浏览

iphone - iPhone - NSUndoManager + NSInvocation + 对象释放 = 崩溃

我正在为我的应用程序构建撤消/重做功能。我正在使用 NSUndoManager 的 NSInvocation 方法。

这就是我构建调用的方式

这些是相关的方法

当 UNDO/REDO 调用 initialState 时,应用程序在 makeUNDO 的第一行崩溃,如代码所示。

如何保留号码而不泄漏?

谢谢。

0 投票
2 回答
365 浏览

iphone - 取消编辑:NSUndoManager 或单独的 NSManagedObjectContext 进行编辑?

我有一个视图控制器,它管理一个始终以编辑模式显示的视图。该视图本质上是一个表格视图,类似于 Apple 的联系人应用程序中的联系人详细信息。我的视图下的模型由一个 2 级对象图表示,该对象图由一个根实体组成 - 称之为它R- 与子实体具有一对多关系C。现在,R是一个大对象(它有 20 多个属性,所有属性都是可编辑的,但不是强制性的)。默认情况下,R有子对象n(是一个可配置的值),但是可以通过我的编辑视图n将子对象添加到/从集合中删除,并且也可以编辑子对象的属性。注意RCC实体包括图像元数据的属性,因此在编辑时可能会选择图像并与模型相关联。

编辑R及其子视图通过主表视图表单以及从我导航(来回)到的“辅助”视图执行,以便根据情况收集所需的信息。

我的问题是,在这种情况下您将如何实施“取消所有编辑”,即我应该如何隔离所有编辑以轻松恢复到编辑之前的状态?NSUndoManager与我的主一起使用NSManagedObjectContext?有单独NSManagedObjectContext的编辑?每个人的权衡是什么?

我不在乎redo。我正在寻找一种想法/解决方案,可以在编辑时使用的内存量与如果应用程序在编辑时中断时保存用户数据的能力之间取得平衡。

谢谢你的所有想法。

0 投票
4 回答
3460 浏览

iphone - 如何使用 NSUndoManager 支持替换 UITextView 中的文本?

我希望能够以编程方式替换 UITextView 中的一些文本,所以我将此方法编写为 UITextView 类别:

它可以工作,但 NSUndoManager 在self.text=textStorage我找到一个私有 API 之后就停止工作(它似乎被重置):-insertText:(NSString *)它可以完成这项工作,但谁知道如果我使用它,Apple 是否会批准我的应用程序。有什么方法可以用 NSUndoManager 支持在 UITextView 中替换文本?或者我在这里遗漏了什么?

0 投票
1 回答
389 浏览

objective-c - UITextView 和 NSUndoManager 同步

我曾尝试先搜索,但找不到我需要的确切内容。

我有一个 UITextView 并且我有按钮可以在 UITextViews NSUndoManager 上执行撤消和重做操作,以便该部分正常工作,但问题就来了。撤消操作正在撤消我在文本视图成为第一响应者后创建的所有更改,因此能够进行详细的撤消或重做操作,这些操作仅撤消或重做最后一个操作,而不是从 UITextView 成为第一响应者的那一刻起执行的所有操作我应该有这样的代码:

但是这段代码不是解决方案,它可以工作,但我想以与上面代码相​​同的方式同步在 UITextView 中执行的操作,但不将 UITextView 作为第一响应者。

寻求帮助。

0 投票
1 回答
902 浏览

ios - 核心数据和撤消组

我是第一次使用 Core Data,这让我很困惑。

我有以下方法来处理对我的更改进行分组并保存它们:

在 NSLog 语句的帮助下,我知道这是事件的顺序:

  • 在根视图中启动应用程序
  • 进入列表视图
    开始
  • 离开列表视图
    结束/保存
  • 进入项目详情视图
  • 进入类别详情视图
    开始
  • 触摸添加类别按钮,这会将我们带到另一个视图
    开始
  • 输入新数据
  • 触摸完成按钮
    结束/保存
  • 触摸返回以返回项目详细信息视图
  • 触摸取消按钮
    取消
  • 返回列表视图
    开始

此时我的新类别消失了,我不明白为什么。它被包裹在一个组中,该组被结束并保存。那时它不应该不会被回滚吗?我原以为取消只会影响在项目详细信息视图中所做的任何更改。如果它现在的行为方式是正确的,那么我如何让它表现出我所期望的方式呢?

任何澄清将不胜感激!

0 投票
1 回答
204 浏览

cocoa - 撤消管理器未与 NSPersistentDocument 保持同步

我在核心数据数据库中有一些计算值,我需要在保存之前对其进行更新。基本上我对一些实体进行编号以简化它们之间的导航。

目前我正在观察NSManagedObjectContextWillSaveNotification并尝试在那里进行编号。我所做的更改似乎已保存,但撤消管理器似乎仍有一些修改。这使得文档看起来像是发生了变化(标记在关闭按钮上),即使托管对象上下文说它没有 ( hasChanges)。如果我撤消一次,文档看起来没有任何变化,但反过来,托管对象上下文确实如此。

撤消管理器是否以某种方式将自身重置在错误的位置,或者我做错了什么?

更新

我在其中进行重新编号的有点混淆的代码如下所示:

包含一个文本字段,该_contentViewController字段将被解析为SomeItem.

0 投票
2 回答
535 浏览

objective-c - 无法撤消多个操作

当我在删除单个对象后对上下文调用 undo 时,一切都按预期工作。但是如果用户删除了一个对象,然后又删除了另一个对象,那么无论用户请求撤消多少次,撤消都只会恢复第二个对象,就好像 undoLevels 设置为 1。无论 undoLevels 是否默认为 0(无限制)或明确设置为 6 作为测试。

此外,如果单个操作删除了多个对象,那么之后调用 undo 是没有效果的;没有对象被恢复。我尝试用 begin/endUndoGrouping 明确地将删除循环括起来,但无济于事。undoManager 的 groupsByEvent 为 YES(默认情况下),但无论我调用直接 undo 还是 undoNestedGroup 都没有区别。

每次操作后是否以某种方式保存上下文?不,因为如果我在运行这些测试后退出并重新启动应用程序,所有对象仍然存在于数据库中。

我错过了什么?


好的,你想要代码。以下是我认为最相关的内容:

上下文获取器:

多对象删除方法(由模态面板上的按钮调用):

这是从其关系和有序缓存中删除对象的 Series 方法:

这是由 comm-z undo 调用的方法及其后续操作:

这是在撤消/唤醒后重新生成其缓存的系列方法:

(我省略了 Locator 的 regenerateObjCachesFromMuddies,因为虽然我使用它的表来查看删除和撤消的结果,但我可以使用新的 fetch 重新加载表,完全重新生成表的缓存,并且这个测试仍然显示撤消不工作。)

像往常一样,将一个 SO 问题放在一起有助于解决问题,我现在意识到只要我使用不涉及互惠 SpecialObject-Series 关系的简单对象,撤消就可以正常工作。我在那里做错了什么......