Cocoa:NSTextStorageDelegate是否已过期NSLayoutManager?

Cocoa:NSTextStorageDelegate是否已过期NSLayoutManager?,cocoa,nstextview,nslayoutmanager,Cocoa,Nstextview,Nslayoutmanager,我正在使用NSTextView,并为其-textStorage属性设置了一个委托。收到-textStorageDidProcessEditing:后,我需要将属性应用于文本的某些部分 正在应用我的属性,但它们总是在我进行编辑之前应用于文本,即使我调用的是NSLayoutManager的方法,而不是来自-will…,而是did… 这就好像布局管理器在执行时不知道最近的glyph插入/删除,因此我假设NSTextView/NSTextStorage调用委托方法,然后通知布局管理器进行更新 有没有一种

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

正在应用我的属性,但它们总是在我进行编辑之前应用于文本,即使我调用的是NSLayoutManager的方法,而不是来自
-will…
,而是
did…

这就好像布局管理器在执行时不知道最近的glyph插入/删除,因此我假设NSTextView/NSTextStorage调用委托方法,然后通知布局管理器进行更新

有没有一种方法可以强制布局管理器立即进行更新,从而使其正常工作


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

我找到了解决此问题的方法。如果您同时注册为NSTextStorage的
-textStorageDidProcessEditing:
和NSLayoutManager的
-didInvalidateLayout:
通知的代理,则可以有效地“排队”来自文本存储代理的操作,只有在布局管理器代理收到安全的通知后,才会运行该命令。

我找到了解决此问题的方法。如果您同时注册为NSTextStorage的
-textStorageDidProcessEditing:
和NSLayoutManager的
-didInvalidateLayout:
通知的代理,则可以有效地“排队”来自文本存储代理的操作,只有在布局管理器委托收到安全的通知后,才会运行该命令