2010-11-09 24 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值。