NSMutableAttributedStrings - objectAtIndex:effec

2019-06-26 10:42发布

我想一些花哨的文本添加到标签,但我碰到的一些问题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!^

什么是标签的样子:

Answer 1:

你的长度是worldRange太长。 NSMakeRange有两个参数,起点和长度 ,没有起点和终点。 这可能是为什么你弄不清这两个问题。



Answer 2:

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

因此,如果你在开始索引6和去length的字符后,你打算过去字符串的结尾,你想要的是:

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


文章来源: NSMutableAttributedStrings - objectAtIndex:effectiveRange:: Out of bounds