问题标签 [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.
core-data - 核心数据和 NSOperation
我目前正在使用一个用于在后台导入数据的NSPersistentDocument
子类。NSOperation
根据文档,我正在观察NSManagedObjectContextDidSaveNotification
在后台任务中保存后并NSManagedObjectContext
使用-mergeChangesFromContextDidSaveNotification:
.
一切正常,但它为将数据导入新文档的用户呈现了一个奇怪的工作流程。他们需要在导入之前保存一个空文档(否则会-save:
失败,因为该文档没有为NSPersistentStoreCoordinator
.-writeToURL:ofType:forSaveOperation:originalContentsURL:error:
在导入之前被调用。
此外,后台的导入任务似乎排除了NSUndoManager
在主线程上使用。(我假设跨线程共享托管对象上下文的撤消管理器是不安全的。)从用户的角度来看,没有办法撤消在导入期间创建的所有新对象。
我已经阅读了Core Data Programming Guide和 Marcus Zarra 的书,但我对框架的这方面仍然很陌生。希望我忽略了一些事情:如果没有,我会让我的应用程序适应这些限制(Core Data 的好处远远超过这些用户界面限制。)
谢谢你的时间!
--
根据下面 Peter Hosey 的建议,我添加了以下代码以在导入之前创建一个临时持久存储:
然后,在保存面板中选择文件后,临时持久存储将迁移到所选 URL 处的 SQLite 存储:
iphone - 可以将多个 NSUndoManager 与一个 Core-Data managedObjectContext 一起使用吗?
//编辑:真的,没有人对此有任何建议或想法吗?我是否以某种方式错误地问了这个问题?//
我的 iPhone 应用程序有一个 managedObjectContext 和一个中等复杂的数据模型。我现在正在添加撤消功能,但不清楚如何最好地处理嵌套的视图控制器(因为每一层都可能修改数据模型)。
Apple 的文档指出:“考虑一个显示书籍列表的应用程序,并允许您导航到详细视图,进而允许您编辑书籍的各个属性(例如书名、作者和版权日期)。您可以从列表屏幕创建一本新书,在其他两个屏幕之间导航以编辑其属性,然后导航回原始列表。如果列表视图中的撤消操作取消了对作者姓名的更改,这可能看起来很奇怪。将两个屏幕分开,而不是删除整本书。”
那么实现这一点的最佳方法是什么?目前,我正在考虑让每个 viewController 保留自己的 undoManager,只要它在屏幕上,它就会处于活动状态。所以我的理解是,这将需要以下步骤(对于每个 VC):
- 添加属性:
myUndoManager
- 添加
undoManager
方法返回myManagedObjectContext.undoManager;
- In
viewDidAppear
:myManagedObjectContext.undoManager = myUndoManager;
// 如果为 nil,则首先创建 - 在
viewWillDisappear
:myManagedObjectContext.undoManager = nil;
- 关于内存警告:
[self.undoManager removeAllActions ];
- 在dealloc上:
self.myUndoManager = nil;
- 对于每个模型更改:
[self.undoManager setActionName:NSLocalizedString(@“XXX”,@“”)];
- CoreData 将处理实际的撤消/重做发布
另外,我必须保持 firstResponder:
- 在
viewDidAppear
:`[self becomeFirstResponder]' - 添加
canBecomeFirstResponder
方法返回 YES - 在
viewWillDisappear
:[self resignFirstResponder]; - 在子视图辞职时重新启用 firstResponder(例如 textFields)
到目前为止,这似乎有效,即使在加载/卸载周期中也是如此,并且非常独立,但我有几个问题:
- 首先,这是跨多个 VC 实现撤消的最佳实践吗?
- 我是否会因为我的子 VC 在我之前的操作之前没有进行撤消而遇到麻烦?
- 如果是这样,该列表是否包含我需要做的所有事情?
- ManagedObjectContext 会与多个处于活动状态的 UndoManager 混淆吗?
- 在交换 undoManager 之前是否需要调用 ProcessPendingActions?
ios - iOS - UITextView + NSUndoManager
我正在尝试将撤消/重做功能集成到 UITextView(我正在构建一个 LateX 编辑器)中,但没有运气,老实说,我对这个论点感到非常困惑。我不明白这两个操作涉及的步骤,我的意思是我需要两个方法
- 一个删除最后插入的文本
- 一个恢复被删除的文本
一个疑问是我在哪里得到最后插入的文本?换句话说,我必须在哪里注册撤消?
- 在 textViewDidChange 我可以得到整个文本
- 在 textViewShouldChangeTextInRange 我可以插入最后一个字符
我知道我写的不是最好的解释,但我希望这里有人过去也遇到过同样的问题,可以给我一个提示。基本上,要恢复,我必须将撤消/重做功能添加到文本视图,可能有两个按钮与这些操作相关联。
提前致谢
iphone - NSImageView 和 NSUndoManager
我在视图上有一个图像,用户可以拖动和移动图像或用手指触摸旋转图像。
我想做撤消用户执行的操作。
就像图像移动到新位置然后用户按下撤消按钮一样,图像应该移回以前的位置。或者,如果用户旋转图像然后按下撤消按钮,它应该将图像旋转到之前的角度。
如果我得到任何相同的示例,那将会很有帮助。
提前致谢
cocoa - 如何使 NSUndoManager 的撤消/重做动作名称正常工作?
我正在学习 Cocoa,并且我已经撤消了工作,没有太多麻烦。但是 setActionName: 方法让我很困惑。这是一个简单的示例:一个玩具应用程序,其窗口包含一个文本标签和两个按钮。按下开按钮,标签上显示“开”。按下关闭按钮,标签变为“关闭”。这是两个相关的方法(我为应用程序编写的唯一代码):
这是我的期望:
- 我点击开按钮
- 标签更改为“开”
- 在编辑菜单中是“撤消打开标签”项
- 我点击那个菜单项
- 标签更改为“关闭”
- 在编辑菜单中是“重做打开标签”项
事实上,除了最后一个之外,所有这些都按我的预期工作。编辑菜单中的项目显示为“重做关闭标签”,而不是“重做打开标签”。(当我单击该菜单项时,标签确实会变为 On,正如我所料,但这使菜单项的名称更加神秘。)
我有什么误解,我怎样才能让这些菜单项以我想要的方式显示?
uitextview - 当某些文本附加到 textView 时,iOS -NSUndoManager 停止工作
所以我的问题是让我的 textView 能够撤消/重做操作(我使用两个按钮来执行此操作)。阅读文档我发现 UITextView 有一个内置的 undoManager 并且他的基本用法非常简单。到目前为止我做了什么?
我有一个包含 textView 的 viewController (EditorViewController)。
在 EditorViewcontroller.h
在 EditorViewController.m --> viewDidLoad
正如我所说的,两个按钮用于执行撤消/重做操作,这两个按钮位于 textView 的 inputAccessoryView 中,这个视图基本上是一个工具栏,有几个按钮用于将文本附加到 textView。
我有一个名为 appendText 的方法:
现在,如果我使用键盘书写,一切都很好,我的意思是撤消和重做可以正常工作。但是当我使用 appendText: 方法追加一些文本时,不会执行撤消和重做。如果我开始使用键盘再次写入撤消和重做(撤消堆栈的第一个元素是最后写入的文本)就像 if每次我附加一些文本时,撤消和重做堆栈都会被清除。我希望有人能给我一个提示..
ios - UISearchBar的undoManager可以去掉吗?
我想知道是否可以删除 UISearchbar 的 undoManager,因为我不打算使用它。或者有什么办法让我禁用或隐藏它?
谢谢。
iphone - NSUndoManager 帮助
好的,所以我想在我的应用程序中添加撤消某些操作的功能。我打算用我自己的协议或其他东西创建一种方法来做到这一点,但后来我发现了NSUndoManager
. 我想使用内置的基础方式,但我似乎无法弄清楚。我需要撤消多个骰子滚动,所以如果我可以将以前的骰子存储为 中的对象NSArray
,那可能是最好的。我可以使用NSMutableString
,但首选数组。
然后我知道你可以摇晃来撤消,但我宁愿有一个按钮。这些一直给我带来最大的麻烦。我在下面列出了我的尝试。这些都没有奏效。任何帮助,将不胜感激。
在 viewDidLoad 中:
然后在掷骰子的方法中,我尝试了:
然后是链接到撤消按钮的 IBAction:
提前致谢
objective-c - Cocoa:寻找一种在不搞乱撤消的情况下对 NSTextView 存储进行编程操作的通用策略
我正在用 cocoa 编写一个特殊用途的文本编辑器,它可以执行自动文本替换、内联文本完成(ala Xcode)等操作。
我需要能够以编程方式操作NSTextView
'sNSTextStorage
以响应 1)用户输入,2)用户粘贴,3)用户删除文本。
我尝试了两种不同的通用方法,它们都导致NSTextView
's 本机撤消管理器以不同的方式不同步。在每种情况下,我只使用NSTextView
委托方法。我一直在努力避免子类化NSTextview
或NSTextStorage
(尽管如有必要我会子类化)。
我尝试的第一种方法是从textView
delegate
'textDidChange
方法中进行操作。在该方法中,我分析了 中的更改,textView
然后调用了一个通用方法来修改文本,该方法通过调用shouldChangeTextInRange:
和调用将更改包装在 textStorage 中didChangeText:
。一些编程更改允许完全撤消,但有些则不允许。
我尝试的第二种textView
方法(也许更直观,因为它在文本实际出现在 s 中之前进行了更改)是从delegate
'sshouldChangeTextInRange:
方法中进行操作,再次使用相同的通用存储修改方法,该方法将存储中的更改包装为调用shouldChangeTextInRange:
和didChangeText:
。由于这些更改最初是从内部触发的shouldChangeTextInRange:
,因此我设置了一个标志,告诉内部调用shouldChangeTextInRange:
被忽略,以免进入递归黑洞。同样,一些程序性更改允许完全撤消,但有些则不允许(尽管这次不同,并且方式不同)。
有了所有这些背景,我的问题是,有人可以指出一种以编程方式操作存储的通用策略,以NSTextview
保持撤消管理器的清洁和同步?
我应该在哪个NSTextview
委托方法中注意 textView 中的文本更改(通过键入、粘贴或删除)并对NSTextStorage
? 或者是通过子类化NSTextView
or来做到这一点的唯一干净方法NSTextStorage
?
objective-c - 撤消核心数据更改的操作名称
我正在寻找一种内置(或易于实现)的方法来让 Core Data 撤消/重做操作名称读起来像“撤消编辑名字”,而不是像他们那样简单地“撤消”或“重做”默认情况下。
我有一个 Core Data 应用程序,并将其NSUndoManager
用作我窗口的撤消管理器。它工作得很好,但是当用户对字段进行更改(从 内联NSTableView
)时,撤消菜单项的标题不会反映更改了哪个字段。
最初的搜索让我找到了 2007 年 1 月在Apple 邮件列表上发布的相同问题。发布的唯一答案是“在 Core Data Programming Guide 中搜索'Model.strings'”。我的模型没有字符串文件,所以我创建了一个(在我的 en.lproj 目录中本地化并使用 UTF-16 编码),但这没有任何区别。
我遵循了 Apple教程中的说明(由于我的应用程序不是基于文档的,因此稍作修改)和Core Data 文档,但我的菜单标题仍然显示为“撤消”和“重做”。