2

NSString * hello = @"helloworld";があるとします。

ここで、helloworldの地獄が太字になっている属性付きの文字列が必要です。

これを行うWeb上の関数があります:

- (NSMutableAttributedString*) word:(NSString*)substringToHighlight{

    NSMutableAttributedString * mutableAttributedString = [[ NSMutableAttributedString alloc]initWithString:self];
    NSUInteger count = 0, length = [mutableAttributedString length];
    NSRange range = NSMakeRange(0, length);

    count = 0,
    length = [mutableAttributedString length];
    range = NSMakeRange(0, length);
    while(range.location != NSNotFound)
    {
        range = [[mutableAttributedString string] rangeOfString:substringToHighlight options:0 range:range];
        if(range.location != NSNotFound) {

            //[mutableAttributedString setTextColor:[UIColor blueColor] range:NSMakeRange(range.location, [word length])];
            range = NSMakeRange(range.location + range.length, length - (range.location + range.length));
            count++;
        }
    }
    return mutableAttributedString;
}

ただし、mutableAttributedStringはsetTextColorをサポートしていないため、この関数は機能しません。

私も試しました

NSDictionary * dict = @{kCTFontAttributeName:boldFontName};
        [mutableAttributedString setAttributes:{kCTFontAttributeName:boldFontName} range:NSMakeRange(range.location, substringToHighlight.length)];

しかし、メッセージkCTFontAttributeNameが定義されていません。

4

1 に答える 1

6

rangeOfString:options:range:またはNSScannerを使用できます(正規表現のような他の可能性もありますが、とにかく)。

指定されたオプションに従って、レシーバーの指定された範囲内で、指定された文字列の最初の出現範囲を検索して返します。

  • (NSRange)rangeOfString:(NSString *)aString options:(NSStringCompareOptions)mask range:(NSRange)aRange

これは別の解決策です:

NSMutableAttributedString次に、このように変換する必要があります。

NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:@"hello world"];
NSRange selectedRange = NSMakeRange(0, 4); // 4 characters, starting at index 0

[string beginEditing];

[string addAttribute:NSFontAttributeName
           value:[NSFont fontWithName:@"Helvetica-Bold" size:12.0]
           range:selectedRange];

[string endEditing];

これが最善の解決策だと思います。

于 2013-01-30T05:49:58.703 に答える