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

iphone - UIWindow 子类中的摇动手势检测接管默认文本撤消管理器

我想要的是让我的 iPhone 应用程序一直知道摇动手势,除非有任何UITextfieldUITextview成为 firstResponder。

(我跟着这个:https ://stackoverflow.com/questions/150446/how-do-i-detect-when-someone-shakes-an-iphone/1351486#1351486I )

我子类化UIWindow并实现motionEnded:withEvent:了方法,即使我将 a 设置UITextView为 firstResponder,它也可以工作。我的自定义UIWindow调用motionEnded:withEvent:,即使它不是 firstResponder。

所以问题是我UItextView的默认撤消管理器不再响应抖动。无论 view-hierarchy 或 firstResponders 如何更改,UIWindow都接管了 Shake-Gesture 的所有处理。

任何人都可以阐明如何暂时禁用 UIWindow 的检测或让当前的 firstResponder 根据我的实现接管 Shaking-Gesture 吗?

提前致谢!

0 投票
1 回答
423 浏览

iphone - NSUndoManager 是否可以在没有摇晃手势的情况下在 iPhone 上工作?

我有一个应用程序将摇动手势用于撤消之外的其他操作。我想使用 NSUndoManager 并且所有示例和操作方法都说我必须将以下行放在我的 applicationDidFinishLaunching 方法中。

是否可以在不支持摇动撤消手势的情况下使用 NSUndoManager?

0 投票
1 回答
2306 浏览

cocoa-touch - NSUndoManager 和启用/禁用撤消按钮

在我的 iOS 应用程序的界面中,我有明确的撤消和重做按钮(摇动撤消是一个非常重量级的操作,在这种情况下,撤消非常频繁地执行)。通常,我会使用 KVO 来观察 NSUndoManager 的 canUndo 和 canRedo 关键路径,并在通知进入时启用和禁用按钮。不幸的是,NSUndoManager 似乎对这些关键路径不兼容 KVO——或者至少,我我在通知方面看不到任何东西。

所以我的问题是:我如何让这个工作?我只是在 KVO 上做错了吗?(我已经检查了两次和三次,但总是有这种可能性)。还有另一种我没有想到的方法吗?(我虽然只是在每次运行循环旋转时检查 -canUndo 的值,但这对我来说有一种不好的代码味道)。

(请注意,NSUndoManager 在 iOS 和 Mac OS X 上很可能不同,所以在这种情况下,我认为“它适用于 Mac”不会是一个有用的答案)

0 投票
1 回答
526 浏览

iphone - iOS 4 应用程序终止和撤消

使用 ?时处理 iOS 4 应用程序终止的好方法是NSUndoManager什么?

我有一个使用 Core Data 的 iPhone (iOS 4) 应用程序。该应用程序允许用户编辑托管对象,并且我NSUndoManager以一种直接的方式实现撤消使用:在模态显示编辑器视图之前,我NSUndoManager为托管对象上下文创建一个新的。我还开始撤消分组,以便在用户点击“取消”按钮时可以轻松撤消任何更改。如果用户点击“保存”,我只需删除撤消管理器,更改就会永久生效。到现在为止还挺好。

如果用户在编辑对象的过程中按下主页按钮(或接听电话),应用程序将暂停。它向应用程序委托发送一条applicationDidEnterBackground消息,我利用这个机会保存托管对象上下文。当然,上下文包含新的编辑,只是等待被NSUndoManager.

这是问题所在:如果应用程序后来“未暂停”,它NSUndoManager仍然存在并且一切正常。但是,如果应用程序被操作系统“在睡眠中杀死”,撤消堆栈就会丢失,并且对对象所做的更改现在将成为永久性的。在重新启动时,我想将应用程序恢复到它被暂停之前的完全相同的状态,但这似乎需要我保存和恢复撤消堆栈。不幸的是,我找不到明显的方法来做到这一点。

是否有一种支持撤消的好方法,以便无论应用程序是否终止,它都能始终如一地工作?我希望我遗漏了一些明显的东西。任何帮助或建议将不胜感激。

0 投票
1 回答
457 浏览

cocoa - 核心数据和撤消错误加上没有重做

所以问题是:我将一些项目放入编辑器区域,它会创建一个撤消分组......在幕后,因为删除项目的整个过程实际上是一个任务集合。如果我随后删除任务,我可以选择撤消删除。

如果我执行此撤消操作,我会在控制台中收到错误消息:_endUndoGroupRemovingIfEmpty:: NSUndoManager 0x343f5a0 处于无效状态,调用 endUndoGrouping 时没有匹配的开始

它确实将所有项目返回到视图中,但是......从这一点开始,我的撤消堆栈被搞砸了并且没有做正确的事情。从现在开始,REDO 甚至不再起作用。

我也试过这个,只从工作流程中删除一个项目......然后撤消删除......仍然抛出错误。

所以有两个问题:1.为什么会发生错误。2. 为什么我的重做功能完全不正确?

谢谢你的帮助

0 投票
2 回答
316 浏览

cocoa - 在删除后通知 Core Data 模型对象被恢复的正确方法是什么?

我已经使用 Core Data 设置了一个优雅的系统,每当模型对象的属性发生更改时,它都会使用键值观察自动反映在其关联视图中,但我在使用 undo 时遇到了问题。

当我删除模型对象时会出现问题。发生这种情况时,关联的视图与所有键值观察一起被销毁。用户突然决定删除是一个坏主意,并发出恢复模型对象的撤消命令。此时键值观察已被破坏,我似乎无法找到一种很好的方法来确定哪个模型对象已从死里复活并重新设置所有内容。

我想到的当前解决方案是注册 NSUndoManagerDidUndoChangeNotification,然后手动浏览我的核心数据模型对象并查看哪些没有关联的视图。我认为必须有一种方法可以知道哪个特定对象已被带回,但我认为这种方法会矫枉过正。

我还考虑过创建一个撤消组,在模型对象重新出现时重新添加已删除的视图,但我希望仅在可能的情况下保持我的撤消管理器与模型相关。

我想我正在寻找的解决方案是让撤消管理器说,“嘿!任何有兴趣的人都听好了!我刚刚做了一个撤消,这是已经复活的核心数据模型对象!用它做你想做的事!” 然后我设置视图,就好像创建了一个新的模型对象一样。

有什么想法或指导吗?

0 投票
1 回答
198 浏览

iphone - NSUndoManager 在某些情况下停止撤消

我正在尝试使用 Core Data 在我的应用程序中实现撤消管理器。而不是使用我的 ManagedObjectContext 中的默认撤消管理器来制作我自己的 UndoManager。因此,我没有手动注册任何操作,也没有开始或结束任何撤消组。撤消在大多数情况下都可以正常工作,但在某些情况下它只会停止并且不会撤消。

我记录了 groupingLevel 并注意到在任何操作上,groupingLevel 从 0 增加到 1。对于任何其他操作,groupingLevel 保持在 1。

如果我调用撤消,级别会递减回 0 并保持在 0 以进行进一步撤消。

但是,当我撤消到某些条件时,groupingLevel 会回到 1,我不能再撤消了!!!!!!!!!

当我调用 [[managedObjectContext undoManager] undo] 时,groupingLevel 如何增加?

0 投票
1 回答
1484 浏览

iphone - 如何使用 NSUndoManager 实现撤消?

我正在尝试向NSUndoManager我的程序添加一个,但我不确定如何向经理注册这些方法?使用 :

如果我有以下方法怎么办:

如何使用撤消管理器注册此方法?选择器(发送者)的对象不是我要注册的。我需要通过一次撤消调用来减少 myFoo、yourFoo 和 fooFoo。

0 投票
1 回答
1615 浏览

cocoa - Can't successfully register undo from NSTextField

I have a simple document-based application that simply creates a custom XML file. It uses an Outline View to navigate the XML document. When an item in the Outline View is selected a custom view is displayed as a sub view of the document view that allows the user to enter in data. On one of the views has a NSTextField. It has its "Allows Undo" flag set. I tested to ensure the undoManager is called on the NSDocument when the editing is completed. So the control seems to be bouncing through the First Responder as it should.

In the IBAction I use the ActionName so it will display correctly in the menu. Now here is the problem. Not only is the ActionName not displayed in the menu, but clicking undo doesn't reverse the action taken on the NSTextField but the action registered just before it. Is there something I overlooked when setting up undo with NSTextField?

(IBAction)textFieldChanged:(id)sender{

...some code here...

[[self undoManager]setActionName:@"Change Text"];

}

Thanks in advance, Rob

0 投票
1 回答
1395 浏览

multithreading - Cocoa 应用程序中无法解释的 NSUndoManager 崩溃/断言

我正在使用 Cocoa、OpenGL 应用程序遇到一个奇怪的问题。每当我启动我的应用程序时,我都会在控制台上收到以下与 eh NSUndoManager 相关的消息/断言失败。顺便说一句,我没有使用撤消管理器。

2010-09-05 03:28:49.184 CocoaCoreTest[51721:a0f] *** Assertion failure in +[NSUndoManager _endTopLevelGroupings], /SourceCache/Foundation/Foundation-751.29/Misc.subproj/NSUndoManager.m:271
2010-09-05 03:28:49.188 CocoaCoreTest[51721:a0f] +[NSUndoManager(NSInternal) _endTopLevelGroupings] is only safe to invoke on the main thread.
2010-09-05 03:28:49.189 CocoaCoreTest[51721:a0f] *** Assertion failure in +[NSUndoManager _endTopLevelGroupings], /SourceCache/Foundation/Foundation-751.29/Misc.subproj/NSUndoManager.m:271
2010-09-05 03:28:49.190 CocoaCoreTest[51721:a0f] An uncaught exception was raised 2010-09-05 03:28:49.190 CocoaCoreTest[51721:a0f] +[NSUndoManager(NSInternal) _endTopLevelGroupings] is only safe to invoke on the main thread.
2010-09-05 03:28:49.192 CocoaCoreTest[51721:a0f] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '+[NSUndoManager(NSInternal) _endTopLevelGroupings] is only safe to invoke on the main thread.'
*** Call stack at first throw: ( 0 CoreFoundation 0x00007fff83e97cc4 __exceptionPreprocess + 180
1 libobjc.A.dylib 0x00007fff883bb0f3 objc_exception_throw + 45
2 CoreFoundation 0x00007fff83e97ae7 +[NSException raise:format:arguments:] + 103
3 Foundation 0x00007fff84cf2d5a -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 198
4 Foundation 0x00007fff84c4b936 +[NSUndoManager(NSPrivate) _endTopLevelGroupings] + 140
5 AppKit 0x00007fff823219f9 -[NSApplication run] + 689
6 AppKit 0x00007fff8231a5f8 NSApplicationMain + 364
7 CocoaCoreTest 0x000000010003b753 main + 33
8 CocoaCoreTest 0x0000000100021608 start + 52
9 ??? 0x0000000000000001 0x0 + 1
) terminate called after throwing an instance of 'NSException'

我在主线程上运行我的 GUI,实际上我没有产生任何其他线程。当我为 x86_64 编译时,我在调试和发布模式下遇到了这个崩溃。然而,有趣的是,当我为 i386 编译时,并没有出现这个错误。

谢谢你的帮助!

弗洛里安