我在cocoa中编写了一个特殊用途的文本编辑器,它可以执行自动文本替换,内联文本完成(ala Xcode)等操作.
我需要能够以编程方式操纵NSTextView
的NSTextStorage
响应于1)用户打字,2)用户粘贴,3)用户滴文本.
我尝试了两种不同的通用方法,它们都导致了NSTextView
本机撤销管理器以不同的方式失去同步.在每种情况下,我只使用NSTextView
委托方法.我一直试图避免继承NSTextview
或NSTextStorage
(尽管我会在必要时继承).
我想第一种方法是从内做操作textView
delegate
的textDidChange
方法.从该方法中,我分析了已经更改的内容textView
,然后调用了一个通用方法,用于修改包含textStorage中的更改的文本,并调用shouldChangeTextInRange:
和didChangeText:
.一些程序化更改允许清除撤消,但有些没有.
第二个(也许更加直观,因为它使修改文本之前居然出现在textView
)的方法,我试图从内做操作delegate
的shouldChangeTextInRange:
方法,再次使用该包装的变化在存储有相同的通用存储修改方法打电话给shouldChangeTextInRange:
和didChangeText:
.由于这些更改最初是从内部触发的shouldChangeTextInRange:
,因此我设置了一个标志,告诉内部调用shouldChangeTextInRange:
被忽略,以免输入递归黑洞.同样,一些程序化更改允许清除撤消,但有些没有(虽然这次不同,并以不同的方式).
有了这样的背景,我的问题是,是否有人能指出我的一般策略,以编程方式操作存储,以NSTextview
保持撤消管理器清洁和同步?
NSTextview
我应该在哪个委托方法中注意textView中的文本更改(通过键入,粘贴或删除)并对其进行操作NSTextStorage
?或者是通过子类化或者NSTextView
或者唯一的干净方式来做到这一点NSTextStorage
?