2012-02-01 10 views
5

Mam cztery pola tekstowe, które wiążą się ze ścieżką klucza modelu. Jeśli numer jest wpisany w pole tekstowe, wszystko działa zgodnie z planem. Jednakże, jeżeli liczba jest usuwany następnie pojawia się błąd w konsoli z:setNilValueForKey error

[0x1003144b0 Temperatura setNilValueForKey]: nie mógł ustawić zero jako wartość dla klucza Rankine

Próbowałem to naprawić za pomocą setNilValueForKey, ale wygląda na to, że nie działa (zobacz kod na dole pliku Temperature.h). Wszelkie sugestie, jak to naprawić, będą pomocne.

#import <Foundation/Foundation.h> 

@interface Temperature : NSObject { 
    double celsius; 
} 

- (void)setCelsius:(double)degreesC; 
- (double)celsius; 

- (void)setKelvin:(double)degreesK; 
- (double)kelvin; 

- (void)setFahrenheit:(double)degreesF; 
- (double)fahrenheit; 

- (void)setRankine:(double)degreesR; 
- (double)rankine; 
@end 

i

#import "Temperature.h" 

@implementation Temperature 

+ (NSSet *)keyPathsForValuesAffectingFahrenheit { 
    return [NSSet setWithObject:@"celsius"]; 
} 

+ (NSSet *)keyPathsForValuesAffectingKelvin { 
    return [NSSet setWithObject:@"celsius"]; 
} 

+ (NSSet *)keyPathsForValuesAffectingRankine { 
    return [NSSet setWithObject:@"celsius"]; 
} 

- (void)setCelsius:(double)degreesC { 
    celsius = degreesC; 
} 

- (double)celsius { 
    return celsius; 
} 

- (void)setKelvin:(double)degreesK { 
    [self setCelsius:degreesK - 273.15]; 
} 
- (double)kelvin { 
    return [self celsius] + 273.15; 
} 

- (void)setFahrenheit:(double)degreesF { 
    [self setCelsius:(degreesF - 32)/1.8]; 
} 
- (double)fahrenheit { 
    return [self celsius] * 1.8 + 32; 
} 

- (void)setRankine:(double)degreesR { 
    [self setCelsius:(degreesR - 491.67) * 5/9]; 
} 
- (double)rankine { 
    return ([self celsius] + 273.15) * 9/5; 
} 

- (void)setNilValueForKey:(NSString *)rankine { 
    [super setNilValueForKey:rankine]; 
} 
@end 

... odpowiedzieć na podstawie komentarzy ...

- (void)setNilValueForKey:(NSString*)key { 
    if ([key isEqualToString:@"celsius"]) return [self setCelsius: 0]; 
    if ([key isEqualToString:@"fahrenheit"]) return [self setFahrenheit: 0]; 
    if ([key isEqualToString:@"kelvin"]) return [self setKelvin: 0]; 
    if ([key isEqualToString:@"rankine"]) return [self setRankine: 0]; 

    [super setNilValueForKey:key]; 
} 

Odpowiedz

12

Twój ominięcie -setNilValueForKey: nie osiągnąć niczego, ponieważ po prostu wywołuje super (który jest przeznaczony do zgłaszania wyjątku). Musisz właściwie obsłużyć wartość zerową. Dokładnie tak, jak obsługiwać to do ciebie, ale coś w tym może być uzasadnione:

- (void)setNilValueForKey:(NSString*)key 
{ 
    if ([key isEqualToString:@"rankine"]) 
    { 
     self.rankine = 0; 
     return; 
    } 

    [super setNilValueForKey:key]; 
} 

Prawdopodobnie też chcą obsługiwać wartości zerowe dla innych kluczy w swojej klasie (Fahrenheita, Kelvina i Celsjusza).

+0

Ah! Rozumiem, że działa z twoją sugestią. Dzięki! Oto kod. – wigging

+0

Zobacz edytowany post na odpowiedź na podstawie komentarza Madsena. – wigging