2012-04-11 73 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];