0

NSNumberFormatterをサブクラス化して、ObjectiveCで独自のカスタムフォーマッターを作成しようとしています。具体的には、数値が特定の値を上回ったり下回ったりした場合に、数値を赤に変えたいと思います。アップルのドキュメントには

たとえば、負の金額を赤で表示する場合は、このメソッドで赤のテキストの属性を持つ文字列を返すようにします。attributedStringForObjectValue:withDefaultAttributes:stringForObjectValue:を呼び出して属性のない文字列を取得し、その文字列に適切な属性を適用します。

このアドバイスに基づいて、私は次のコードを実装しました

- (NSAttributedString*) attributedStringForObjectValue: (id)anObject withDefaultAttributes: (NSDictionary*)attr;
{
    NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:[self stringForObjectValue:anObject]];

    if ([[attrString string] floatValue] < -20.0f) {
        [attrString addAttribute:@"NSForegroundColorAttributeName" value:[NSColor redColor] range:NSMakeRange(0, 10)];
        return attrString;
    } else return attrString;
}

しかし、これをテストすると、アプリケーションがフリーズするだけです。何かアドバイスをいただければ幸いです。ありがとう。

4

2 に答える 2

3

これはあなたが作成したあなたと関係があると思いNSRangeます。あなたの長さ(あなたの例では10)は範囲外だと思います。を初期化するために使用する文字列の長さを取得してみてくださいNSMutableAttributedString

例えば:

- (NSAttributedString*) attributedStringForObjectValue: (id)anObject withDefaultAttributes: (NSDictionary*)attr;
{
    NSString *string = [self stringForObjectValue:anObject];
    NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:string];
    NSInteger stringLength = [string length];

    if ([[attrString string] floatValue] < -20.0f)
    {
        [attrString addAttribute:@"NSForegroundColorAttributeName" value:[NSColor redColor] range:NSMakeRange(0, stringLength)];
    }

    return attrString;
}
于 2012-12-31T22:41:03.363 に答える
0

これが私が最終的にこれを実装することができた方法です。数値が負の場合に見やすくするために、テキストの背景を赤に白のテキストにすることにしました。次のコードは NSTextField セルで機能します。私の質問 (および回答) のコードが機能しない理由がわかりません。 addAttribute が機能するはずです。

- (NSAttributedString *)attributedStringForObjectValue:(id)anObject withDefaultAttributes:  (NSDictionary *)attributes{

    NSString *string = [self stringForObjectValue:anObject];
    NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:string];
    NSInteger stringLength = [string length];

    if ([[attrString string] floatValue] < 0)
    {
         NSDictionary *firstAttributes = @{NSForegroundColorAttributeName: [NSColor whiteColor],
                                      NSBackgroundColorAttributeName: [NSColor blueColor]};
    [attrString setAttributes:firstAttributes range:NSMakeRange(0, stringLength)];
}

return attrString;
}
于 2013-05-28T14:26:27.417 に答える