0

我正在尝试通过继承 NSNumberFormatter 在Objective C 中编写我自己的自定义格式化程序。具体来说,我想做的是让一个数字在高于或低于某些值时变为红色。苹果文档

例如,如果您希望负财务金额以红色显示,您可以让此方法返回一个带有红色文本属性的字符串。在 attributesStringForObjectValue: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 回答