2012-02-01 6 views
5

Ho quattro campi di testo che si collegano al percorso chiave del modello. Se un numero viene digitato nel campo di testo, tutto funziona come pianificato. Tuttavia, se il numero viene cancellato allora ottengo un errore nella console con:errore setNilValueForKey

[Temperatura 0x1003144b0 setNilValueForKey]: non poteva impostare zero come valore per la Rankine chiave

Ho cercato di risolvere questo problema utilizzando setNilValueForKey ma sembra non funzionare (vedere il codice alla fine del file Temperature.h). Qualche suggerimento su come risolvere questo potrebbe essere utile.

#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 

e

#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 

... rispondere sulla base di commenti ...

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

risposta

12

tuo forzatura dei -setNilValueForKey: non realizzare nulla perché semplicemente chiama super (che è progettato per generare un'eccezione). È necessario gestire correttamente il valore nullo. Esattamente come gestire spetta a voi, ma qualcosa di simile potrebbe essere ragionevole:

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

    [super setNilValueForKey:key]; 
} 

Probabilmente vogliono anche per gestire i valori pari a zero per gli altri tasti della tua classe (Fahrenheit, Kelvin, e Celsius).

+0

Ah! Hai funzionato usando il tuo suggerimento. Grazie! Ecco il codice. – wigging

+0

Vedere post modificato per la risposta basato sul commento di Madsen. – wigging

Problemi correlati