我试图为使用NSTextView支持的Core Data做一些非常重要的工作。我希望在我的核心数据模型中存储而不是整个NSTextStorage,而是将其分解为段落并将这些段落保存在单独的实体中。
事实上,我把这一切都搞定了。但我无法处理撤消/重做支持。如果我在TextDidChange通知中存储了每个更改,我基本上会失去NSTextView的撤销支持,因为Core Data开始存储进入文本存储的每个字符。因此,撤消管理器单独注册该操作。当我撤消时,我只是逐个字符地撤消,这不是我想要的东西。如果我不在Core Data中存储输入的文本,textview的撤消管理工作正常。
我如何知道撤消管理器何时开始和关闭一组操作,因此我只能在关闭某个组时存储更改?
我试图观察NSUndoManager的NSUndoManagerDidCloseUndoGroupNotification,但它没有帮助,因为我在每个单个字符输入期间都收到了通知,仍然得到了令人讨厌的逐个字符撤消行为。
甚至可以获得解决方法吗?
更新:当我更新核心数据实体时,我能够通过disableUndoRegistration()实现我的目标。但我想知道是否还有另一种解决方案。
答案 0 :(得分:1)
看起来,它正在发挥作用。 在textStorageDidProcessEditing委托方法中,我计算对NSTextStorage所做的更改。并在我的核心数据模型中找到正确的段落实体。然后我更新了模型,但在开始之前,我禁用了managedObjectContext的撤销注册,并在完成模型更新后启用它。所有这些我都是textStorageDidProcessEditing委托方法。整夜测试了这个。没有发现任何错误。 NSTextView的撤消管理器按预期工作,我的模型根据这些文本更改进行更新。最后Core Data模型没有一个很大的NSAttributtedString传输属性,而是一个NSOrderedSet实体,每个实体代表一个NSTextView的唯一段落(感谢NSUUID)
答案 1 :(得分:0)
事实上,我做到了。最终,这并不难。但是确实需要一些时间。 这是我用于NSTextStorage的存储库,用于跟踪段落:https://github.com/CineDev/ParagraphTextKit