各テキストフィールドの変更を監視するために、いくつかのNSTextFieldにオブザーバーを追加しました。各テキストフィールドのキーは、InterfaceBuilderので設定されBindings -> Value -> Model Key Path
ます。1つのテキストフィールドの数値が変更されると、他のテキストフィールドの値が自動的に更新されます。各テキストフィールドにオブザーバーが追加されたため、アプリをクラッシュさせるループを回避するために、他のオブザーバーを削除する必要があります。オブザーバーを削除したら、他のテキストフィールドに追加して、ユーザーによる入力を監視できるようにする必要があります。私のアプローチはうまく機能していますが、多くのオブザーバーが追加された場合、これがどのように面倒になるかがわかります。
ユーザーの入力に応じてオブザーバーを追加および削除する必要がない場所にこれを合理化する方法はありますか?
#import "Converter.h"
@interface Converter ()
@property double kilometer, mile, foot;
@end
@implementation Converter
- (void)awakeFromNib {
[self addObserver:self forKeyPath:@"kilometer" options:0 context:nil];
[self addObserver:self forKeyPath:@"mile" options:0 context:nil];
[self addObserver:self forKeyPath:@"foot" options:0 context:nil];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if ([keyPath isEqualToString:@"kilometer"]) {
[self removeObserver:self forKeyPath:@"mile"];
[self removeObserver:self forKeyPath:@"foot"];
NSLog(@"kilometers");
[self setMile: [self kilometer] * 0.62137119 ];
[self setFoot: [self kilometer] * 3280.8399 ];
[self addObserver:self forKeyPath:@"mile" options:0 context:nil];
[self addObserver:self forKeyPath:@"foot" options:0 context:nil];
}
if ([keyPath isEqualToString:@"mile"]) {
[self removeObserver:self forKeyPath:@"kilometer"];
[self removeObserver:self forKeyPath:@"foot"];
NSLog(@"miles");
[self setKilometer: [self mile] * 1.609344 ];
[self setFoot: [self mile] * 5280 ];
[self addObserver:self forKeyPath:@"kilometer" options:0 context:nil];
[self addObserver:self forKeyPath:@"foot" options:0 context:nil];
}
if ([keyPath isEqualToString:@"foot"]) {
[self removeObserver:self forKeyPath:@"kilometer"];
[self removeObserver:self forKeyPath:@"mile"];
NSLog(@"feet");
[self setKilometer: [self foot] * 0.0003048 ];
[self setMile: [self foot] * 0.00018939394 ];
[self addObserver:self forKeyPath:@"kilometer" options:0 context:nil];
[self addObserver:self forKeyPath:@"mile" options:0 context:nil];
}
}
@end
ユーザーインターフェイスのスクリーンショットは次のとおりです。
コードが何をしているのか(または何をしていると思われるのか)を明確にするために:
ユーザーはフィートをキロメートルとマイルに変換したいので、フィートのテキストフィールドに値を入力します。適切な変換係数が使用されます。
ユーザーはキロメートルをマイルとフィートに変換したいので、キロメートルフィールドに値を入力します。異なる変換係数のセットが使用されます。
等...