NSNumber在if-else中被识别为NSString

时间:2011-12-07 20:07:17

标签: objective-c nsstring nsnumber

我有这些代码让我发疯了。它是一个显示4个属性的cellForRowAtIndexPath,其中2个是NSStrings,2个是NSNumber:

//THIS LOGS THE OBJECT BEFORE PROCESSING
NSLog(@"NO DATE EDITING");
NSLog(@"eFK: %@, eFN: %@",editedFieldKey, editedFieldName);
NSLog(@"editedObject vWA is:%@", editedObject);
NSLog(@"Is of type NSString?: %@", ([editedFieldKey isKindOfClass:[NSString class]])? @"Yes" : @"No");
//THIS TESTS TO SEE IF ITS A NSSTRING
if ([editedFieldName isKindOfClass:[NSSTRING class]]) {
    NSLog(@"its nsstring");
    textField.text = [editedObject valueForKey:editedFieldKey];
    NSLog(@"its NOT nsstring");
    }
} else {
//ELSE ITS A NUMBER SO GET ITS STRING VALUE BEFORE ASSIGNING
    textField.text = [[editedObject valueForKey:editedFieldKey] stringValue];
    // And we set the switch to ON if YES, OFF if NO...
    if ([editedObject valueForKey:editedFieldKey]) {
        NSLog(@"itemreceived equal to 1");
        itemReceived.on = YES;
    } else {
        NSLog(@"itemreceived equal to 0");
        itemReceived.on = NO;
}
[textField becomeFirstResponder];

我有4个字段,2个NSStrings和2个NSNumber。当我点击字符串字段时,我得到一个字符串,它工作正常。但是,如果我点击其中一个数字字段,我得到一个字符串和NSCFNumber isNaturallyRTL ...无法识别的选择器发送到实例:

textField.text = [editedObject valueForKey:editedFieldKey];

为什么我的测试失败了?为什么即使我选择一个不是字符串的数字,应用程序也会通过第一个if条件,就像它是一个字符串一样?

2 个答案:

答案 0 :(得分:3)

如果我不得不猜测,我会说你正在测试错误变量的类型。而不是:

...
if ([editedFieldName isKindOfClass:[NSSTRING class]]) {
...

根据您的变量名称(因为您的问题有点缺乏细节),您似乎想要:

...
if ([[editedObject valueForKey:editedFieldKey] isKindOfClass:[NSSTRING class]]) {
...

我把你的拼写错误留在了片段中 - 但这不能编译。您实际上不是在使用[NSString class]而不是[NSSTRING class]吗?请注意大写差异。

答案 1 :(得分:0)

嗯。这只是猜测...但首先:

NSLog(@"Is of type NSString?: %@", ([editedFieldKey isKindOfClass:[NSString class]])? @"Yes" : @"No");

在这里,您看一下editedFieldKey

if ([editedFieldName isKindOfClass:[NSSTRING class]]) {

您在这里看editedFieldName。在这两种情况下,我看起来好像你正在测试实际值。