objective-c - setNilValueForKey 错误

标签 objective-c cocoa null key-value-coding

我有四个绑定(bind)到模型键路径的文本字段。如果在文本字段中输入一个数字,一切都会按计划进行。但是,如果号码被删除,那么我会在控制台中收到错误消息:

[Temperature 0x1003144b0 setNilValueForKey]:无法将 nil 设置为键 rankine 的值

我尝试使用 setNilValueForKey 解决此问题,但它似乎不起作用(请参阅 Temperature.h 文件底部的代码)。有关如何解决此问题的任何建议都会有所帮助。

#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

#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

...根据评论回答...

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

最佳答案

您对 -setNilValueForKey: 的覆盖不会完成任何事情,因为它只是调用 super(旨在引发异常)。您需要真正正确地处理 nil 值。具体如何处理取决于您,但这样的事情可能是合理的:

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

    [super setNilValueForKey:key];
}

您可能还想为类中的其他键(华氏度、开尔文和摄氏度)处理 nil 值。

关于objective-c - setNilValueForKey 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9102884/

相关文章:

c - 将 int 转换为 char 数组的函数,一些问题

arrays - 将未嵌套的空值数组插入 double 列,postgresql

c - c 中的 null 类型和编译器错误

ios - 使用 objective-c/core graphics 的水平居中文本

objective-c - PDFView setNeedsDisplay :YES doesn't work on MacOS Sierra 10. 12

objective-c - 如何拦截来自 WKWebView 的下载?

cocoa - 如何给 NSWindow 特定的背景颜色

ios - 关于Objective-C的编程概念

ios - 如何将 UIView 添加到 Objective-C 中的表格单元格?

cocoa - SystemStatusBar::NSStatusItem 的选择器无法识别