Изменение приписанной строки
NSMutableAttributedString
объявляет много методов для изменения и символы и атрибуты. Необходимо заботиться для не изменения значений атрибута после того, как они были переданы приписанной строке. Вы, возможно, также должны восстановить несоответствия, которые могут быть представлены, если Вы изменяете приписанную строку.
Изменение атрибутов
NSMutableAttributedString
объявляет много методов для изменения и символы и атрибуты, такие как примитив replaceCharactersInRange:withString:
и setAttributes:range:
, или более удобные методы addAttribute:value:range:
, applyFontTraits:range:
, и т.д.
Следующий пример иллюстрирует, как указать атрибут ссылки для выбранного диапазона в приписанной строке, подчеркнуть текст и окрасить его в синий. Обратите внимание на то, что можно определить любое значение, Вы хотите для атрибута ссылки, Вам решать интерпретировать значение, когда ссылка выбрана — видят Атрибуты Доступа — обычно, однако, Вы используете или строку или URL. Для объяснения роли beginEditing
и endEditing
(показанный в выборке), посмотрите Несоответствия Фиксации.
NSMutableAttributedString *string; // assume string exists |
NSRange selectedRange; // assume this is set |
NSURL *linkURL = [NSURL URLWithString:@"http://www.apple.com/"]; |
[string beginEditing]; |
[string addAttribute:NSLinkAttributeName |
value:linkURL |
range:selectedRange]; |
[string addAttribute:NSForegroundColorAttributeName |
value:[NSColor blueColor] |
range:selectedRange]; |
[string addAttribute:NSUnderlineStyleAttributeName |
value:[NSNumber numberWithInt:NSSingleUnderlineStyle] |
range:selectedRange]; |
[string endEditing]; |
Значения атрибута, присвоенные приписанной строке, становятся свойством той строки и не должны быть изменены “позади приписанной строки” другими объектами. Выполнение так может представить противоречивый внутреннее состояние приписанной строки. Существует две главных причины для этого:
То, как значение атрибута распространяет через приписанную строку, не предсказуемо. При изменении значения Вы могли бы редактировать больше приписанной строки, чем Вы думали. Фактически значение, возможно, было скопировано в стек отмены, или в полностью различный документ, и т.д.
Приписанные строки делают кэширование и uniquing атрибутов, предполагающий, что не изменяются значения атрибута. Предположение - это
isEqual:
иhash
на значениях атрибута не изменится, как только было установлено значение атрибута.
Если Вы должны изменить значения атрибута и уверены, что изменение применится к корректному диапазону, существует две стратегии, которые можно принять:
Используйте значение атрибута чей
isEqual:
иhash
не зависьте от значений, которые Вы изменяете.Косвенность использования: используйте значение атрибута в качестве ключа поиска в таблицу, где может быть изменено фактическое значение. Например, это могло бы быть надлежащим подходом для того, чтобы иметь «таблицу стилей» - как атрибут.
Фиксация несоответствий
Все методы для изменения непостоянной приписанной строки должным образом обновляют отображение между символами и атрибутами, но после изменения некоторые несоответствия могут разработать. Вот некоторые примеры требований непротиворечивости атрибута:
Сценарии могут только быть присвоенными шрифтами, поддерживающими их. Например, Кандзи и арабские символы не могут быть присвоены римский временами шрифт и должны быть повторно присвоенными шрифтами, поддерживающими эти сценарии.
Удаление присоединяемых символов от строки требует, чтобы были выпущены соответствующие присоединяемые объекты. Точно так же удаление присоединяемых объектов требует, чтобы соответствующие присоединяемые символы были удалены из строки.
Приложение редактирования кода, выводящее на экран все ключевые слова языка в полужирном шрифте, может автоматически присвоить этот атрибут, поскольку пользователь изменяет шрифт или редактирует текст.
Расширения Набора Приложения NSMutableAttributedString
определите методы для фиксации этих несоответствий, поскольку внесены изменения. Это позволяет атрибутам быть очищенными на низком уровне, скрывая потенциальные проблемы от более высоких уровней и предусматривая очень чистое обновление дисплея, когда изменяются атрибуты. Существует четыре метода для фиксации атрибутов и два группе, редактирующей изменения:
Первый метод, fixAttributesInRange:
, вызывает другие три fix...
методы для очистки удаленных присоединяемых ссылок, атрибутов шрифта и атрибутов абзацев, соответственно. Описания отдельного метода объясняют, что очистка влечет за собой для каждого случая.
NSMutableAttributedString
обеспечивает beginEditing
и endEditing
методы для подклассов NSMutableAttributedString
переопределять. Эти методы позволяют экземплярам подкласса записывать или буферизовать группы изменений и очищать себя при получении endEditing
сообщение. endEditing
метод также позволяет получателю уведомлять любых наблюдателей, что это было изменено. NSTextStorage
реализация endEditing
, например, фиксирует измененные атрибуты и затем уведомляет его менеджеров по расположению, что они должны передать и восстановить изображение своего текста. Реализации по умолчанию ничего не делают.