2012-02-01 5 views
5

Tengo cuatro campos de texto que se unen a la ruta de la clave del modelo. Si se escribe un número en el campo de texto, todo funciona según lo planeado. Sin embargo, si se elimina el número entonces consigo un error en la consola con:setNilValueForKey error

[0x1003144b0 Temperatura setNilValueForKey]: no pudo establecer nulo como valor para la Rankine clave

Traté de solucionar este problema utilizando setNilValueForKey pero no parece funcionar (ver código en la parte inferior del archivo Temperature.h). Cualquier sugerencia sobre cómo solucionar esto sería útil.

#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 

y

#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 

... respuesta basada en los comentarios ...

- (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]; 
} 

Respuesta

12

Su anulación de -setNilValueForKey: no lograr nada, ya que sólo llama a super (que está diseñado para arrojar una excepción). Necesitas manejar correctamente el valor nulo. Exactamente cómo manejar la situación depende de usted, pero algo como esto podría ser razonable:

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

    [super setNilValueForKey:key]; 
} 

Es probable que también quieren manejar valores nulos para las otras llaves en su clase (Fahrenheit, Kelvin y Celsius).

+0

¡Ah! Lo conseguí trabajando usando tu sugerencia. ¡Gracias! Aquí está el código. – wigging

+0

Consulte la publicación editada para obtener una respuesta basada en los comentarios de Madsen. – wigging