我在几个 NSTextFields 中添加了观察者来监控每个文本字段的变化。每个文本字段的键在 Interface Builder 中配置Bindings -> Value -> Model Key Path
。当一个文本字段中的数字更改时,其他文本字段会自动更新其值。由于每个文本字段都添加了一个观察者,因此我必须删除其他观察者以避免导致应用程序崩溃的循环。删除观察者后,我必须将它们添加回其他文本字段,以便可以监视它们以供用户输入。我的方法运行良好,但我可以看到如果添加了很多观察者,这会变得很麻烦。
有没有办法将其简化到我不必根据用户的输入添加和删除观察者的地方?
#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
这是用户界面的屏幕截图:
为了帮助澄清代码正在做什么(或假设正在做什么):
用户想要将英尺转换为公里和英里,因此他在英尺文本字段中输入了一个值。使用适当的转换因子。
用户想要将公里转换为英里和英尺,因此他在公里字段中输入了一个值。使用了一组不同的转换因子。
ETC...