6

我正在用一个相对较小的文本编辑器完成一个不错的应用程序。在执行语法高亮显示期间,我发现自己需要更改已识别标记的前景色属性。我注意到NSTextStorage有一个属性:

var fixesAttributesLazily: Bool { get }

关于它的文档是:

一个布尔值,指示文本存储对象是否懒惰地修复属性。(只读)

讨论

子类化时,此属性的默认值为 NO,这意味着您的子类会在属性更改时立即修复它们。系统的具体子类覆盖此属性并将其设置为 YES。

我真的不知道如何解释这个......但这就是我所做的:

  1. 我正在更改内部识别标记的属性textStorage(textStorage: NSTextStorage, didProcessEditing editedMask: NSTextStorageEditActions, range editedRange: NSRange, changeInLength delta: Int)(这是 NSTextStorage 的委托方法)。在这里,我正在检查此属性的值 - 它是 FALSE。
  2. 我完全按照 Apple 的建议( https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/TextStorageLayer/Tasks/Subclassing.html )对NSTextStorage 进行了子类化并覆盖了该属性。文本视图开始表现得很奇怪。实际上,对于小文本,它的性能还可以,但是一旦我打开一个 4 MB 的文件-它就会挂起并且……好吧……坏事开始发生在我的 mac 上。实际上,这种行为不依赖于fixesAttributesLazily属性的值。也许我的 NSTextStorage 实现很糟糕,或者至少不复杂。

任何在后台或懒惰地应用属性的技巧或......这样的东西都是受欢迎的。

另外:我知道有很多方法可以优化突出显示的语法。它可能会部分突出显示,使用某种逻辑,基于更改的范围......等等。我正在寻找的是一种在后台处理属性更改的方法。例如,目前当我将 4 MB 文件粘贴到文本视图时,它首先突出显示它(需要 2-3 秒),然后将其可视化。我正在寻找的效果是立即出现的文本,并在一段时间后出现 - 颜色。

我正在做的项目是用 Swift 编写的。

提前感谢大家的帮助。您可以通过 gmail dot com 的 ivailon 与我联系以获取详细信息,因为我不想在这里公开该应用程序……至少现在还没有 ;-)

4

0 回答 0