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

iphone - 使用 NSUndoManager 和 Core Data 嵌套撤消

我对 NSUndoManager 有一点问题。当用户要编辑某个实体 A 时,我将所有内容都放入一个撤消分组中,以便可以轻松撤消更改。到目前为止,一切都很好。

但是,用户在编辑实体 A 的同时,也可以添加或编辑实体 B 的项目,其中 A 有许多 B,B 属于许多 A。这种关系是可选的。

现在,假设用户开始编辑名为 Foo 的实体 A 的项目。在编辑时,他创建了实体 B 的新项目,称为 Bar。然后用户决定取消整个编辑过程,因此对 Foo 的更改被撤消,但 Bar 也消失了。

我如何设法保留对实体 B 的任何更改或添加,并且只撤消 A 的内容?

我尝试使用两个 MOC,但由于关系,我在添加两个不同上下文的对象之间的关系时遇到错误。

谢谢!

0 投票
3 回答
4471 浏览

iphone - 使用 UITextView (iOS/iPHone) 撤消/重做

我有一个 UITextView 始终具有焦点的视图。我想要做的是扩展内置的撤消/重做行为以支持我以编程方式设置文本时的撤消/重做(例如,当我清除它时,通过将其设置为@"")。

由于只有 firstResponder 获得撤消/重做事件,我想我只需使用 UITextView 的 undoManager 属性来创建我的调用。例如,

不幸的是,这不起作用。它:

  1. 将一个空项引入撤消堆栈(“撤消”)
  2. 在该项目之后添加“撤消清除”(如果我点击“撤消”,我会看到“撤消清除”)
  3. 但是,撤消清除和重做清除工作,然后我再次看到“撤消清除”,并且从那里开始不起作用。

有任何想法吗?我接近这个错误吗?

更新:似乎我已经解决了空的撤消项问题:它发生在我调用 prepareWithInvocationTarget后设置 UITextView 的文本时。如果我之前调用它,它不会发生。有趣的是,如果我不调用 prepareWithInvocationTarget (即,通常,当我设置 UITextView 的文本时),空项目不会被推入撤消堆栈。

0 投票
1 回答
830 浏览

iphone - NSUndoManager 未在 iOS 中调用选定的方法

好的,所以我有一个带有 UITextView 的应用程序,我想展示标准的撤消行为。我在这个网站以及 Apple Developer Docs 上搜索了很多教程和答案,但我不明白为什么我制作的东西不起作用。

每当 UITextView 被修改(我使用的是使用 textView.inputView 属性的非标准键盘)时,下面的方法都会传递一个字符串,该字符串是文本视图所需的新文本:

然后在按下 UIButton 时实现撤消

被执行。

我已经在我的头文件中声明了 undoManager 使用

并在我的实现中合成了它,但是当我按下撤消 UIButton 时没有任何反应,并且永远不会调用 setText。我哪里错了?

0 投票
1 回答
586 浏览

iphone - 在 CoreData 应用程序上摇动撤消工作,但没有显示撤消/重做提示

我有一个基于 CoreData 的应用程序,它支持摇动撤销。这目前工作正常,但是当我摇动设备时,撤消会立即发生,而不会首先显示 NSUndoManager 通常免费提供的常用撤消提示。

我从“撤消架构”文档中阅读了“在 iPhone 上使用撤消”,并且我是:

  • 执行canBecomeFirstResponder,返回YES
  • becomeFirstResponder制作视图控制器viewDidAppear
  • resignFirstResponder制作视图控制器viewDidDisappear
  • 将视图控制器中的重新声明self.undoManager为读/写
  • 在方法中创建一个NSUndoManager和设置(我已经验证它被调用)。self.undoManagerUIViewController init
  • 在设置self.managedObjectModel.managedObjectContext.undoManagerself.undoManager中设置为managedObjectModel. 再一次,我已经验证这被调用了。如果我不这样做,撤消根本不起作用。

我已经尝试过的故障排除:

  • 检查撤消确实有效(我看到对我的 managedObjectModel 的更改已恢复)
  • canBecomeFirstResponder正在调用验证
  • 检查是否self.undoManager在撤消操作期间调用了访问器(不是)。

所以我的问题是:

  • 在什么情况下撤消有效但不显示撤消提示?
  • 您接下来会尝试什么来解决此问题?
0 投票
2 回答
1416 浏览

nsundomanager - NSUndoManager 是否保留对象?

我执行以下操作:

我还有一个清除按钮:

问题是 removeAllActions 使应用程序崩溃。当我删除 [pathToRemove autorelease] 时,它起作用了(或者至少没有崩溃。它仍然可能是内存泄漏)。我想我假设 undoManager 在传入“prepareWithInvocationTarget”调用时保留了“pathToRemove”。

不是这样吗?如果不是这种情况,则可能会发生崩溃,因为对“removeAllActions”的调用正在释放“PathToRemove”对象。但这意味着它是 NSUndoManager 中的一个错误,这是极不可能的。

我可以说我的 copyWithZone 实现也不太可能是罪魁祸首,因为 '[pathToRemove description]' 和 '[path description]' 的 NSLog 输出按预期显示不同的地址。

任何帮助,将不胜感激。谢谢。

0 投票
2 回答
715 浏览

core-data - willTurnIntoFault 被多次调用,导致崩溃

在撤消最初创建相关对象的某些代码时,在NSManagedObject我的重写实现的子类中被调用了两次。willTurnIntoFault当尝试在密钥路径上双重注销 KVO 时,这会导致崩溃。

Apple 文件称这是取消注册 KVO 的正确位置。

一点上下文 - 撤消操作涉及从其父视图中删除模型的相应视图。视图保留了它的模型。

所以我的问题是:什么样的程序员错误会导致在willTurnIntoFault子类中被调用两次NSManagedObject

注意:以前我dealloc在这个类中重写,但后来意识到这不推荐用于 NSManagedObject 的子类。我已经将此代码移入-didTurnIntoFault. 我目前没有覆盖 Apple 文档说您不应该覆盖的任何其他方法。

0 投票
1 回答
1993 浏览

iphone - 撤消管理器有什么用?如何使用它?

iphone中撤消管理器的需求是什么?我从来没有在示例程序中看到过这样的按钮。我知道撤消和重做的含义和用途。但我的问题是,为了什么目的,我需要它?如何在我的应用程序中使用它?如果您知道,还建议一个很好的示例代码链接...

谢谢

0 投票
3 回答
3413 浏览

cocoa - NSUndoManager,核心数据和选择性撤消/重做

我正在开发一个核心数据应用程序,该应用程序具有相当大的托管对象层次结构,类似于树。

创建基础对象时,它会创建一些子对象,这些子对象又会创建自己的子对象,依此类推。这些子对象中的每一个都可以使用 NSURLConnections 收集信息。

现在,我想通过 managedObjectContext 中的 undoManager 来支持撤消/重做。问题是,如果用户创建了一个基础对象,然后尝试撤消该操作,则不会删除该基础对象。相反,可以移除一个或多个子对象。显然,这种类型的动作是不可预测的和不受欢迎的。

所以我尝试默认禁用撤消注册。我通过disableUndoRegistration:在 managedObjectContext 中修改任何内容之前调用来做到这一点。然后,在基础操作(例如创建基础对象)之前启用撤消注册,然后再次重新禁用注册。

现在,当我尝试撤消时,出现此错误:

撤消:NSUndoManager 0x1026428b0 处于无效状态,撤消调用嵌套撤消组太多

想法?

0 投票
2 回答
999 浏览

iphone - 为什么NSUndoManager canUndo YES?

我在我的 iPhone 应用程序中创建了一个包含多个 NSNumber 成员的托管对象。我初始化这些值。我还创建了一个子对象成员。然后,我创建了一个撤消管理器,以便我可以对子对象执行撤消操作,而撤消不会影响初始化的参数。但是,当我启动我的应用程序并调用...

......这是“是”。怎么会这样?顶级数据成员重置为零。不仅如此,子对象的 managedObjectContext 也是 nil。在创建撤消管理器之前创建子对象时怎么会这样。撤消管理器是否具有追溯性?即使在我创建撤消管理器之前设置了这些数据成员,它似乎也允许撤消整个托管对象。

任何见解都值得赞赏。

0 投票
1 回答
2706 浏览

iphone - 使用 CoreData 嵌套撤消组

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

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

查询:

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

错误信息:

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

示例代码: