2012-04-11 34 views
1

我在写一个使用核心数据的应用程序,它很大程度上依赖于设置字符串值的属性。但是,我遇到了一个问题,因为Core Data在创建包装方法时使用NSNumber来表示所有数字字段。因此,如果我使用键/值编码传递字符串setValue:forKey:它给我一个类型错误:iOS中的键值类型强制

例如,我有一个对象类型“建筑”。在数据模型中,我称之为 “fbFloors” 设置为整数32.

然后一个属性,在我的代码,我做到以下几点:

大厦* B = [NSEntityDescription insertNewObjectForEntityForName:@ “大厦” inManagedObjectContext: CTX]; [b setValue:@“2”forKey:@“fbFloors”];

这就提出了以下情况例外:

终止应用程序由于未捕获的异常“NSInvalidArgumentException”,原因:“不可接受的类型为属性值:属性=‘fbFloors’;期望的类型= NSNumber;给定类型= __NSCFConstantString;值= 2。“

我希望它强制字符串值为一个数字,但它不想。我尝试过实施coerceValueForFbFloors:但它看起来像只适用于Mac OS X,而不是iOS。

任何想法?

回答

0

您必须将实际的NSNumber实例传递给setValue。例如:

[b setValue [NSNumber numberWithInt:2] forKey:@“fbFloors”];

如果您的数据显示为字符串,则可以使用NSNumberFormatter将其首先转换为NSNumber。

+0

我希望避免这个原因是因为我希望能够避免直接编码它。有很多不同类型的字段,但都是通过文本提要进入的,所以我希望KVC能够强制类型,而不必手动编写每个字段发生的情况。我曾想过添加一个名为“fbFloorsString”的字段,它为我做了转换,但我希望能有一种更自动的方式。 – johnnyb 2012-04-11 15:44:22

1

如果你做了这样的事情...

- (NSNumber*)fbFloorsValue:(NSString*)valueString 
{ 
    return [NSNumber numberWithInteger: [valueString integerValue]]; 
} 

,你必须为每个非字符串属性的方法。然后,当你在一个通用的方法设置这些值...

假设你的键(“fbFloors”)是在一个名为变量,你的价值(“2”)是在一个叫做变量...

id valueObject; 
SEL selector = NSSelectorFromString([NSString stringWithFormat:@"%@Value:", key]); 
if (selector && [self respondsToSelector:selector]) { 
    valueObject = [self performSelector:selector withObject:value]; 
} else { 
    valueObject = value; 
} 
Building * b = [NSEntityDescription insertNewObjectForEntityForName:@"Building" inManagedObjectContext:ctx]; [b setValue:valueObject forKey:@key];