Какао: NSTextStorageDelegate имеет устаревший NSLayoutManager?

Я работаю с NSTextView, и для его свойства -textStorage установлен делегат. При получении -textStorageDidProcessEditing: мне нужно применить атрибуты к частям текста.

Мои атрибуты применяются, но они всегда применяются к тексту до внесения изменений, хотя я вызываю методы NSLayoutManager не из -will..., а из did....

Это как если бы диспетчер компоновки не знал о недавней вставке/удалении глифа в этот момент выполнения, поэтому я предполагаю, что NSTextView/NSTextStorage вызывает метод делегата затем уведомляет диспетчер компоновки об обновлении.

Есть ли способ заставить диспетчер компоновки обновиться с немедленным вступлением в силу, чтобы я мог заставить это работать?

Я знаю о методах -addAttribute:value:range: NSTextStorage и успешно использовал их до этого момента, но я столкнулся с моментом, когда мне нужно теперь сделать это через менеджер компоновки, а не как часть упражнения по рефакторингу/оптимизации.


person d11wtq    schedule 31.10.2010    source источник


Ответы (1)


Я нашел решение этой проблемы. Если вы зарегистрируетесь в качестве делегата как для уведомлений NSTextStorage -textStorageDidProcessEditing:, так и для уведомлений NSLayoutManager -didInvalidateLayout:, вы сможете эффективно «поставить в очередь» операцию из делегата хранилища текста, которая будет выполняться только после того, как делегат диспетчера компоновки получит уведомление о том, что это безопасно.

person d11wtq    schedule 02.11.2010