问题标签 [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 回答
1843 浏览

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 存储:

0 投票
3 回答
1132 浏览

iphone - 可以将多个 NSUndoManager 与一个 Core-Data managedObjectContext 一起使用吗?

//编辑:真的,没有人对此有任何建议或想法吗?我是否以某种方式错误地问了这个问题?//

我的 iPhone 应用程序有一个 managedObjectContext 和一个中等复杂的数据模型。我现在正在添加撤消功能,但不清楚如何最好地处理嵌套的视图控制器(因为每一层都可能修改数据模型)。

Apple 的文档指出:“考虑一个显示书籍列表的应用程序,并允许您导航到详细视图,进而允许您编辑书籍的各个属性(例如书名、作者和版权日期)。您可以从列表屏幕创建一本新书,在其他两个屏幕之间导航以编辑其属性,然后导航回原始列表。如果列表视图中的撤消操作取消了对作者姓名的更改,这可能看起来很奇怪。将两个屏幕分开,而不是删除整本书。”


那么实现这一点的最佳方法是什么?目前,我正在考虑让每个 viewController 保留自己的 undoManager,只要它在屏幕上,它就会处于活动状态。所以我的理解是,这将需要以下步骤(对于每个 VC):

  • 添加属性: myUndoManager
  • 添加undoManager方法返回myManagedObjectContext.undoManager;
  • In viewDidAppear: myManagedObjectContext.undoManager = myUndoManager;// 如果为 nil,则首先创建
  • viewWillDisappearmyManagedObjectContext.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?
0 投票
1 回答
3089 浏览

ios - iOS - UITextView + NSUndoManager

我正在尝试将撤消/重做功能集成到 UITextView(我正在构建一个 LateX 编辑器)中,但没有运气,老实说,我对这个论点感到非常困惑。我不明白这两个操作涉及的步骤,我的意思是我需要两个方法

  • 一个删除最后插入的文本
  • 一个恢复被删除的文本

一个疑问是我在哪里得到最后插入的文本?换句话说,我必须在哪里注册撤消?

  • 在 textViewDidChange 我可以得到整个文本
  • 在 textViewShouldChangeTextInRange 我可以插入最后一个字符

我知道我写的不是最好的解释,但我希望这里有人过去也遇到过同样的问题,可以给我一个提示。基本上,要恢复,我必须将撤消/重做功能添加到文本视图,可能有两个按钮与这些操作相关联。

提前致谢

0 投票
1 回答
336 浏览

iphone - NSImageView 和 NSUndoManager

我在视图上有一个图像,用户可以拖动和移动图像或用手指触摸旋转图像。

我想做撤消用户执行的操作。

就像图像移动到新位置然后用户按下撤消按钮一样,图像应该移回以前的位置。或者,如果用户旋转图像然后按下撤消按钮,它应该将图像旋转到之前的角度。

如果我得到任何相同的示例,那将会很有帮助。

提前致谢

0 投票
3 回答
3490 浏览

cocoa - 如何使 NSUndoManager 的撤消/重做动作名称正常工作?

我正在学习 Cocoa,并且我已经撤消了工作,没有太多麻烦。但是 setActionName: 方法让我很困惑。这是一个简单的示例:一个玩具应用程序,其窗口包含一个文本标签和两个按钮。按下开按钮,标签上显示“开”。按下关闭按钮,标签变为“关闭”。这是两个相关的方法(我为应用程序编写的唯一代码):

这是我的期望:

  • 我点击开按钮
  • 标签更改为“开”
  • 在编辑菜单中是“撤消打开标签”项
  • 我点击那个菜单项
  • 标签更改为“关闭”
  • 在编辑菜单中是“重做打开标签”项

事实上,除了最后一个之外,所有这些都按我的预期工作。编辑菜单中的项目显示为“重做关闭标签”,而不是“重做打开标签”。(当我单击该菜单项时,标签确实会变为 On,正如我所料,但这使菜单项的名称更加神秘。)

我有什么误解,我怎样才能让这些菜单项以我想要的方式显示?

0 投票
1 回答
1235 浏览

uitextview - 当某些文本附加到 textView 时,iOS -NSUndoManager 停止工作

所以我的问题是让我的 textView 能够撤消/重做操作(我使用两个按钮来执行此操作)。阅读文档我发现 UITextView 有一个内置的 undoManager 并且他的基本用法非常简单。到目前为止我做了什么?

我有一个包含 textView 的 viewController (EditorViewController)。

在 EditorViewcontroller.h

在 EditorViewController.m --> viewDidLoad

正如我所说的,两个按钮用于执行撤消/重做操作,这两个按钮位于 textView 的 inputAccessoryView 中,这个视图基本上是一个工具栏,有几个按钮用于将文本附加到 textView。

我有一个名为 appendText 的方法:

现在,如果我使用键盘书写,一切都很好,我的意思是撤消和重做可以正常工作。但是当我使用 appendText: 方法追加一些文本时,不会执行撤消和重做。如果我开始使用键盘再次写入撤消和重做(撤消堆栈的第一个元素是最后写入的文本)就像 if每次我附加一些文本时,撤消和重做堆栈都会被清除。我希望有人能给我一个提示..

0 投票
0 回答
113 浏览

ios - UISearchBar的undoManager可以去掉吗?

我想知道是否可以删除 UISearchbar 的 undoManager,因为我不打算使用它。或者有什么办法让我禁用或隐藏它?

谢谢。

0 投票
1 回答
1866 浏览

iphone - NSUndoManager 帮助

好的,所以我想在我的应用程序中添加撤消某些操作的功能。我打算用我自己的协议或其他东西创建一种方法来做到这一点,但后来我发现了NSUndoManager. 我想使用内置的基础方式,但我似乎无法弄清楚。我需要撤消多个骰子滚动,所以如果我可以将以前的骰子存储为 中的对象NSArray,那可能是最好的。我可以使用NSMutableString,但首选数组。

然后我知道你可以摇晃来撤消,但我宁愿有一个按钮。这些一直给我带来最大的麻烦。我在下面列出了我的尝试。这些都没有奏效。任何帮助,将不胜感激。

在 viewDidLoad 中:

然后在掷骰子的方法中,我尝试了:

然后是链接到撤消按钮的 IBAction:

提前致谢

0 投票
2 回答
1610 浏览

objective-c - Cocoa:寻找一种在不搞乱撤消的情况下对 NSTextView 存储进行编程操作的通用策略

我正在用 cocoa 编写一个特殊用途的文本编辑器,它可以执行自动文本替换、内联文本完成(ala Xcode)等操作。

我需要能够以编程方式操作NSTextView'sNSTextStorage以响应 1)用户输入,2)用户粘贴,3)用户删除文本。

我尝试了两种不同的通用方法,它们都导致NSTextView's 本机撤消管理器以不同的方式不同步。在每种情况下,我只使用NSTextView委托方法。我一直在努力避免子类化NSTextviewNSTextStorage(尽管如有必要我会子类化)。

我尝试的第一种方法是从textView delegate'textDidChange方法中进行操作。在该方法中,我分析了 中的更改,textView然后调用了一个通用方法来修改文本,该方法通过调用shouldChangeTextInRange:和调用将更改包装在 textStorage 中didChangeText:。一些编程更改允许完全撤消,但有些则不允许。

我尝试的第二种textView方法(也许更直观,因为它在文本实际出现在 s 中之前进行了更改)是从delegate'sshouldChangeTextInRange:方法中进行操作,再次使用相同的通用存储修改方法,该方法将存储中的更改包装为调用shouldChangeTextInRange:didChangeText:。由于这些更改最初是从内部触发的shouldChangeTextInRange:,因此我设置了一个标志,告诉内部调用shouldChangeTextInRange:被忽略,以免进入递归黑洞。同样,一些程序性更改允许完全撤消,但有些则不允许(尽管这次不同,并且方式不同)。

有了所有这些背景,我的问题是,有人可以指出一种以编程方式操作存储的通用策略,以NSTextview保持撤消管理器的清洁和同步?

我应该在哪个NSTextview委托方法中注意 textView 中的文本更改(通过键入、粘贴或删除)并对NSTextStorage? 或者是通过子类化NSTextViewor来做到这一点的唯一干净方法NSTextStorage

0 投票
1 回答
662 浏览

objective-c - 撤消核心数据更改的操作名称

我正在寻找一种内置(或易于实现)的方法来让 Core Data 撤消/重做操作名称读起来像“撤消编辑名字”,而不是像他们那样简单地“撤消”或“重做”默认情况下。

我有一个 Core Data 应用程序,并将其NSUndoManager用作我窗口的撤消管理器。它工作得很好,但是当用户对字段进行更改(从 内联NSTableView)时,撤消菜单项的标题不会反映更改了哪个字段。

最初的搜索让我找到了 2007 年 1 月在Apple 邮件列表上发布的相同问题。发布的唯一答案是“在 Core Data Programming Guide 中搜索'Model.strings'”。我的模型没有字符串文件,所以我创建了一个(在我的 en.lproj 目录中本地化并使用 UTF-16 编码),但这没有任何区别。

我遵循了 Apple教程中的说明(由于我的应用程序不是基于文档的,因此稍作修改)和Core Data 文档,但我的菜单标题仍然显示为“撤消”和“重做”。