我正在使用NSTextView,并为其-textStorage
属性设置了一个委托。收到-textStorageDidProcessEditing:
后,我需要将属性应用于文本的各个部分。
我的属性已被应用,但是即使我不是从-will...
而是从did...
调用NSLayoutManager的方法,也总是在进行编辑之前将它们应用于文本。
好像布局管理器在执行的这一点上不知道最近的字形插入/删除,因此我假设NSTextView / NSTextStorage调用了委托方法,然后通知布局管理器进行更新。
有没有一种方法可以强制布局管理器立即生效,以便使它生效?
我知道NSTextStorage
的-addAttribute:value:range:
方法,到目前为止已经成功使用了这些方法,但是我遇到了需要通过布局管理器执行此操作的问题,而不是作为其中一部分重构/优化练习。
最佳答案
我找到了解决此问题的方法。如果您同时注册为NSTextStorage的-textStorageDidProcessEditing:
和NSLayoutManager的-didInvalidateLayout:
通知的委托,则可以从文本存储委托中有效地“排队”操作,该操作仅在布局管理器委托接收到可以安全执行的通知后才运行所以。
关于cocoa - cocoa :NSTextStorageDelegate具有过时的NSLayoutManager吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4063750/