我有两个属性,TKelvin和TCelsius。
当我在窗口中更改TKelvin时,应使用TKelvin更新TCelsius - 273.15 和 当我在我的窗口TCelcius中更改时,TKelvin应该自动更新为TCelcius + 273.15。
我尝试了以下代码:
{
NSNumber *number;
[self willChangeValueForKey:@"TKelvin"];
[self setPrimitiveT:newTKelvin];
[self didChangeValueForKey:@"TKelvin"];
if ([newTKelvin doubleValue] != [[self TCelsius] doubleValue] + 273.15) {
double tCelsiusValue = [newT doubleValue] - 273.15;
number = [NSNumber numberWithDouble:tCelsiusValue];
[self setValue:number forKey:@"TCelsius"];
}
}
这适用于实体(TCelcius已更改)但TCelsius不会在窗口中自动更新。我该怎么办?
答案 0 :(得分:2)
如果TCelcius始终基于TKelvin值,则只存储其中一个值并根据需要计算另一个值会更简单。您可以从对象模型中删除TCelcius属性。这将使两个值保持同步。
在标题
中定义TCelcius属性@property (assign) NSNumber *TCelcius;
添加keyPathsForValuesAffectingValueForKey以允许KVO和Bindings知道您的TCelcius值取决于TKelvin值。
+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key {
NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key];
if ([key isEqualToString:@"TCelcius"]) {
NSSet *affectingKeys = [NSSet setWithObjects:@"TKelvin", nil];
keyPaths = [keyPaths setByAddingObjectsFromSet:affectingKeys];
}
return keyPaths;
}
然后为TCelcius值添加一个getter和setter,重定向到TKelvin值:
- (NSNumber *)TCelcius {
return [NSNumber numberWithDouble:[[self TKelvin] doubleValue]-273.15];
}
+ (void)setTCelcius:(NSNumber *)newTCelcius {
[self setTKelvin:[NSNumber numberWithDouble:[[self newTCelcius] doubleValue]+273.15]];
}
确保删除当前的setter并使用动态getter和setter作为TKelvin值。