NSMutableAttributedStrings - objectAtIndex: effectiveRange:: Вне границ

Я пытаюсь добавить на ярлык какой-то причудливый текст, но у меня возникли проблемы с классом NSMutableAttributedString. Я пытался добиться четырех следующих: 1. Изменить шрифт, 2. Подчеркнуть диапазон, 3. Изменить цвет диапазона, 4. Верхний диапазон.

Этот код:

- (void)applicationDidFinishLaunching:(NSNotification*)aNotification
{
    NSMutableAttributedString* display = [[NSMutableAttributedString alloc]
                                          initWithString:@"Hello world!"];
    NSUInteger length = [[display string]length] - 1;

    NSRange wholeRange = NSMakeRange(0, length);
    NSRange helloRange = NSMakeRange(0, 4);
    NSRange worldRange = NSMakeRange(6, length);

    NSFont* monoSpaced = [NSFont fontWithName:@"Menlo" 
                                         size:22.0];

    [display addAttribute:NSFontAttributeName
                    value:monoSpaced
                    range:wholeRange];

    [display addAttribute:NSUnderlineStyleAttributeName 
                    value:[NSNumber numberWithInt:1] 
                    range:helloRange];

    [display addAttribute:NSForegroundColorAttributeName 
                    value:[NSColor greenColor]
                    range:helloRange];

    [display addAttribute:NSSuperscriptAttributeName 
                    value:[NSNumber numberWithInt:1] 
                    range:worldRange];

    //@synthesize textLabel; is in this file.
    [textLabel setAttributedStringValue:display];
}

Дает мне эту ошибку:

NSMutableRLEArray objectAtIndex:effectiveRange:: Out of bounds

Кроме того, я пытался возиться с диапазонами, но стал еще более запутанным, когда я попробовал NSRange worldRange = NSMakeRange(4, 5);. Я не понимаю, почему это производит следующее: Hell^o wor^ld!, где буквы внутри ^ s являются верхними строками.

NSRange worldRange = NSMakeRange(6, 6); дает желаемый эффект, hello ^world!^.

Как выглядит ярлык:
outputtedText

Ответы

Ответ 1

Ваша длина слишком длинная на WorldRange. NSMakeRange принимает два аргумента, начальную точку и длину, а не начальную точку и конечную точку. Вероятно, поэтому вы путаетесь в обеих проблемах.

Ответ 2

NSRange имеет два значения: начальный индекс и длину диапазона.

Итак, если вы начинаете с индекса 6 и переходите length после того, как вы закончите конец строки, то вы хотите:

NSRange worldRange = NSMakeRange(6, length - 6);