Cocoa:NSTextStorageDelegate 的 NSLayoutManager 已经过时了?

标签 cocoa nstextview nslayoutmanager

我正在使用 NSTextView 并为其 -textStorage 属性设置了委托(delegate)。收到 -textStorageDidProcessEditing: 后,我需要将属性应用于文本的部分。

我的属性正在被应用,但它们总是在我进行编辑之前应用于文本,即使我不是从 调用 NSLayoutManager 的方法 - will...但是做了...

就好像布局管理器在执行时不知道最近的字形插入/删除,所以我假设 NSTextView/NSTextStorage 调用委托(delegate)方法然后通知布局管理器进行更新。

有没有办法可以强制布局管理器立即更新,以便我可以让它工作?

我知道 NSTextStorage-addAttribute:value:range: 方法,并且到目前为止一直在成功使用这些方法,但我'现在我需要通过布局管理器来完成此操作,而不是作为重构/优化练习的一部分。

最佳答案

我找到了解决这个问题的方法。如果您注册为 NSTextStorage 的 -textStorageDidProcessEditing: 和 NSLayoutManager 的 -didInvalidateLayout: 通知的委托(delegate),那么您可以有效地“排队”来自文本存储委托(delegate)的操作,这只会一旦布局管理器委托(delegate)收到可以安全执行此操作的通知,就运行。

关于Cocoa:NSTextStorageDelegate 的 NSLayoutManager 已经过时了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4063750/

相关文章:

cocoa - KVO 中的更改字典对于选择索引始终包含 NULL

cocoa - TextView 的多个撤消管理器

objective-c - 在 NSTextView 中为行片段重绘单个矩形

cocoa - Swift 协议(protocol) : method does not override any method from its superclass

cocoa - 打开新的 NSWindowController

objective-c - 检测 NSOpenGLView 上的触摸

objective-c - NSTableCellView 中的 NSProgressIndicator

cocoa - NSAttributedString drawAtPoint 和 drawInRect - 差异

swift - 说明keyUp事件已经在Swift中处理了?

ios - NSLayoutManager、boundingRectForGlyphRange 和表情符号