2010-11-09 25 views
0

我有两个属性,TKelvin和TCelsius。同步核心数据中的两个属性

当我在我的窗口TKelvin改变,TCelsius应与TKelvin更新 - 当我在窗口TCelcius更改273.15 和 ,TKelvin应TCelcius + 273.15自动更新。

我尝试以下的代码:

  • (无效)setTKelvin:(的NSNumber *)newTKelvin;

{

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在窗口不会自动更新。我能做什么?

回答

2

如果TCelcius总是基于TKelvin值,那么只存储其中一个值并根据需要计算另一个值会更简单。您可以从对象模型中删除TCelcius属性。这将保持两个值同步。

定义TCelcius财产在头

@property (assign) NSNumber *TCelcius; 

添加keyPathsForValuesAffectingValueForKey允许KVO和绑定要知道,你的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; 
} 

,然后添加了一个重定向到TKelvin值TCelcius值getter和setter:

- (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值。