将NSNumberFormatter与多个NSTextField配合使用

时间:2012-10-29 19:31:27

标签: objective-c cocoa-bindings nstextfield nsnumberformatter

我有几个相互绑定的文本字段,它们会根据顶部文本字段中的值不断更新(请参阅下面的应用程序屏幕截图)。我尝试使用NSNumberFormatter根据文本字段中字符串的长度格式化每个文本字段中的值。如果字符串太长,那么我希望格式化程序样式切换到Scientific。我使用IBActionalloc init数字格式化程序。

我知道有-(void)controlTextDidChange:(NSNotification *)obj但这仅适用于活动的NSTextField;我需要将其他文本字段格式化为其值更改。

如何在不必为每个文本字段设置IBOutlet的情况下完成此操作?

我的格式化程序类:

#import "FormatterObject.h"

@interface FormatterObject ()

@property (weak) IBOutlet NSTextField *textField;

@property double numA, numB, numC;

@end

@implementation FormatterObject

- (IBAction)chooseFormatter:(id)sender {

    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    [formatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
    [formatter setThousandSeparator:@","];
    [formatter setMaximumFractionDigits:6];

    if ( [[_textField stringValue] length] < 10) {
        [formatter setNumberStyle:NSNumberFormatterDecimalStyle];
        [_textField setFormatter:formatter];
    }

    else {
        [formatter setNumberStyle:NSNumberFormatterScientificStyle];
        [_textField setFormatter:formatter];    
    }

    formatter = nil;
}

+ (NSSet *)keyPathsForValuesAffectingNumB {
    return [NSSet setWithObject:@"numA"];
}

+ (NSSet *)keyPathsForValuesAffectingNumC {
    return [NSSet setWithObject:@"numA"];
}

- (void)setNumB:(double)theNumB {
    [self setNumA:theNumB * 1000];
}

- (double)numB {
    return [self numA] / 1000;
}

- (void)setNumC:(double)theNumC {
    [self setNumA:theNumC * 1000000];
}

- (double)numC {
    return [self numA] / 1000000;
}

- (void)setNilValueForKey:(NSString*)key {
    if ([key isEqualToString:@"numA"]) return [self setNumA: 0];
    if ([key isEqualToString:@"numB"]) return [self setNumB: 0];
    if ([key isEqualToString:@"numC"]) return [self setNumC: 0];
    [super setNilValueForKey:key];
}

@end

这是我的应用程序的样子:

enter image description here

以下是每个文本字段的绑定:

enter image description here

0 个答案:

没有答案