NSMutableAttributedStrings - objectAtIndex:effectiveRange ::越界

时间:2012-07-20 02:15:14

标签: objective-c macos nsattributedstring nsrange

我正在尝试向标签添加一些花哨的文本,但我遇到了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

2 个答案:

答案 0 :(得分:41)

worldRange的长度太长了。 NSMakeRange有两个参数,起点和长度,而不是起点和终点。这可能是你为什么对这两个问题感到困惑的原因。

答案 1 :(得分:5)

NSRange有两个值,即起始索引和范围的长度。

因此,如果您从索引6开始并且在此之后转到length个字符,那么您将超越字符串的结尾,您想要的是:

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