Доступ к атрибутам

Приписанная строка идентифицирует атрибуты по имени, храня значение под названием атрибута в NSDictionary объект, поочередно связанный с NSRange это указывает символы, к которым применяются атрибуты словаря. Можно присвоить любую пару значение-имя атрибута, которой Вы желаете к диапазону символов, в дополнение к стандартным атрибутам.

Получение значений атрибута

С неизменной приписанной строкой Вы присваиваете все атрибуты при создании строки. В Java Вы используете конструкторов. В Objective C Вы используете методы такой как initWithString:attributes:, которые явно берут NSDictionary объект пар значение-имя, или initWithString:, который не присваивает атрибутов. И расширения Набора Приложения NSAttributedString добавляют методы, берущие файл RTF или файл HTML. Посмотрите Изменение Приписанной Строки для получения информации о присвоении атрибутов с непостоянной приписанной строкой.

Для получения значений атрибута от любого типа приписанной строки используйте любой из этих методов:

Первые два метода возвращают все атрибуты в данном индексе, attribute:... методы возвращают значение единственного именованного атрибута. Расширения Набора Приложения NSAttributedString добавить fontAttributesInRange: и rulerAttributesInRange:, которые возвращают атрибуты, определенные для применения только к символам или к целым абзацам, соответственно.

Первые четыре метода также возвращают ссылкой диапазон измерений и самый длинный диапазон измерений атрибутов. Эти диапазоны позволяют Вам определять степень атрибутов. Концептуально, каждый символ в приписанной строке имеет свой собственный набор атрибутов; однако, когда атрибуты и значения являются тем же по серии символов, часто полезно знать. Это позволяет подпрограмме развиваться через приписанную строку в блоках, больше, чем отдельный символ. В получении диапазона измерений приписанная строка просто ищет информацию в своем отображении атрибута, по существу словарь атрибутов, применяющихся в индексе, который требуют. В получении самого длинного диапазона измерений приписанная строка продолжает проверять символы мимо этого основного диапазона, пока значения атрибута являются тем же. Это дополнительное сравнение увеличивает время выполнения для этих методов, но гарантирует точный максимальный диапазон для атрибутов, которые требуют.

Эффективные и максимальные диапазоны

Методы, возвращающие диапазон измерений ссылкой, как гарантируют, не возвратят максимальный диапазон, к которому атрибут (ы) применяются; они, как просто гарантируют, возвратятся, некоторые передвигаются, по которому они применяются. На практике они возвратятся, любой диапазон легко доступен от механизмов внутренней памяти приписанной строки, которые могут зависеть от реализации и от точной истории модификаций к приписанной строке.

Методы, возвращающие самый длинный диапазон измерений ссылкой, с другой стороны, как гарантируют, возвратят самый длинный диапазон, содержащий указанный индекс, к которому рассматриваемый атрибут (ы) применяются (ограниченный значением параметра, переданного в для inRange:). Для эффективности важно что inRange: параметр должен быть столь же маленьким как подходящий для диапазона интереса для клиента.

Когда Вы выполняете итерации по приписанной строке диапазонами атрибута, любой вид метода может быть надлежащим в зависимости от ситуации. Если существует некоторая обработка, которая будет сделана для каждого диапазона, и Вы знаете, что полный спектр для данного атрибута оказывается перед необходимостью, обрабатываются в конечном счете, может быть более эффективно использовать вариант самого длинного диапазона измерений, чтобы не должным быть обработать диапазон в частях. Однако необходимо использовать методы самого длинного диапазона измерений с осторожностью, потому что самый длинный диапазон измерений мог быть довольно длинным — потенциально вся длина документа, если inRange: параметр не ограничивается.

Фрагмент кода Objective C ниже прогресса через приписанную строку в блоках на основе диапазона измерений. Фиктивный объект анализатора здесь считает число символов в каждом шрифте. Прогресс цикла с условием продолжения пока полученный диапазон измерений не включает конец приписанной строки, получая шрифт в действительности только мимо последнего полученного диапазона. Для каждого полученного атрибута шрифта анализатор соответствует числу символов в диапазоне измерений. В этом примере возможно что последовательные вызовы attribute:atIndex:effectiveRange: возвратит то же значение.

NSAttributedString *attrStr;
unsigned int length;
NSRange effectiveRange;
id attributeValue;
 
length = [attrStr length];
effectiveRange = NSMakeRange(0, 0);
 
while (NSMaxRange(effectiveRange) < length) {
    attributeValue = [attrStr attribute:NSFontAttributeName
        atIndex:NSMaxRange(effectiveRange) effectiveRange:&effectiveRange];
    [analyzer tallyCharacterRange:effectiveRange font:attributeValue];
}

Напротив, следующий фрагмент кода Objective C развивается через приписанную строку согласно максимальному диапазону измерений для каждого шрифта. В этом случае анализатор считает изменения шрифта, которые не могут быть представлены путем простого получения диапазонов измерений. В этом случае цикл с условием продолжения утвержден на длине ограничивающего диапазона, начинающегося как вся длина приписанной строки и сведенного на нет, в то время как развивается цикл. После того, как анализатор записывает изменение шрифта, предельный диапазон корректируется для учета самого длинного полученного диапазона измерений.

NSAttributedString *attrStr;
NSRange limitRange;
NSRange effectiveRange;
id attributeValue;
 
limitRange = NSMakeRange(0, [attrStr length]);
 
while (limitRange.length > 0) {
    attributeValue = [attrStr attribute:NSFontAttributeName
        atIndex:limitRange.location longestEffectiveRange:&effectiveRange
        inRange:limitRange];
    [analyzer recordFontChange:attributeValue];
    limitRange = NSMakeRange(NSMaxRange(effectiveRange),
        NSMaxRange(limitRange) - NSMaxRange(effectiveRange));
}

Обратите внимание на то, что второй фрагмент кода более сложен. Из-за этого, и потому что attribute:atIndex:longestEffectiveRange:inRange: несколько медленнее, чем attribute:atIndex:effectiveRange:, необходимо обычно использовать его только при необходимости для работы, которую Вы выполняете. В большинстве случаев работа диапазоном измерений достаточно.