上部のテキスト フィールドの値に基づいて継続的に更新される相互にバインドされた複数のテキスト フィールドがあります (以下のアプリケーションのスクリーンショットを参照)。NSNumberFormatter を使用して、テキスト フィールドの文字列の長さに基づいて各テキスト フィールドの値をフォーマットしようとしています。文字列が長すぎる場合は、フォーマッタ スタイルをScientific
. 数値フォーマッタ を使用しIBAction
ています。alloc 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
私のアプリケーションは次のようになります。
各テキスト フィールドのバインディングは次のとおりです。