1

我最近安装了 Mountain Lion,并注意到我的 Mac OS X 应用程序现在具有数据绑定,将 int32 NSTableViewCell 显示为 x,xxx。

IE:.storedata文件显示<attribute name="itemid" type="int32">2533</attribute>,而项目在单元格中显示为2,533. 我无法弄清楚为什么它在 Mountain Lion 中会这样做,但在 Lion 中却没有。

如何让单元格显示为2533而不是2,533

在此处输入图像描述

4

2 回答 2

1

它在 10.8 发行说明中有所记录:

NSString 本地化格式

在 10.8 中,在与 10.8 SDK 链接的应用程序中,-localizedStringWithFormat: 和 -initWithFormat:locale:(和朋友)在提供非零语言环境时,现在将对数字进行本地化格式化。以前这些调用已经做了小数点处理;所以在某些语言环境中,逗号将用于小数点分隔符。这种新行为以此为基础,使用本地化数字以及千位分隔符和正确放置符号符号。

但是我仍然认为它是一个错误(并提交了它),它存在许多问题(与旧版 UI 一起使用,手动编辑时偶尔会出现错误行为等)。

对于新的 UI,您最好在您的 nib 中添加一个数字格式化程序,用于所有显示数字的文本字段。

如果(就像我的例子)你有很多带有更多文本字段的 nib 文件,这个丑陋的 hack 可能会有所帮助:

#import "HHUTextFieldCell.h"

@implementation HHUTextFieldCell //:: NSTextFieldCell

//*****************************************************************************
// Class methods
//*****************************************************************************
+ (void)load {

    // 
    // 10.8 started using thousands separators for text fields. For our legacy
    // apps we don't want those. Rather than changing dozens of xib files with
    // hundreds of text fields, we use a replacement class to modify the text
    // fields to not have a thousands separator.
    // 
    [NSKeyedUnarchiver setClass:[HHUTextFieldCell class] forClassName:@"NSTextFieldCell"];
}

//*****************************************************************************
// Overwritten methods
//*****************************************************************************
- (void)setObjectValue:(id < NSCopying >)object {

    //
    // If `object` is an NSNumber object and no formatter is set, we instead
    // set the description of that number via -setStringValue:. Otherwise
    // use the original implementation.
    // 
    if(!self.formatter && [(NSObject *)object isKindOfClass:[NSNumber class]])
    {
        [super setStringValue:[(NSObject *)object description]];
    }
    else
    {
        [super setObjectValue:object];
    }
}

@end
于 2013-06-18T18:04:02.893 回答
1

我最终添加了一个价值转换器

@implementation ItemIdValueTransformer

+(Class)transformedValueClass
{
    return [NSString class];
}

+ (BOOL)allowsReverseTransformation
{
    return NO;
}

- (id)transformedValue:(id)value
{
    // Remove the ,'s from Mountain Lion and up
    NSString *string = [NSString stringWithFormat:@"%li",(long)[value integerValue]];
    return string;
}

@end
于 2013-07-01T22:28:44.850 回答