带有JSON响应的NSNull isEqualToString问题

时间:2012-12-05 16:25:26

标签: objective-c ios cocoa-touch

我收到以下错误

-[NSNull isEqualToString:]: unrecognized selector sent to instance 0x3c168090

在这行代码上

cell.offerTitle.text = [voucherData objectForKey:@"offer_title"];

有人可以帮我解决问题吗?

由于 奥利弗

4 个答案:

答案 0 :(得分:6)

voucherData是NSDictionary吗?

你的字典中可能有NSNull,当字典试图找到offer_title的对象时,它就会遇到麻烦。

另一种可能性是[voucherData objectForKey:@"offer_title"]正在返回[NSNull null],并且当您尝试传递该标签而不是字符串时,标签会被触发。

尝试在objc_exception_throw中设置断点并阅读堆栈跟踪 - 这将使您更好地了解正在发生的事情。

<强>加了:

id value = [voucherData objectForKey:@"offer_title"];
if ([value isKindOfClass:[NSNull class]])
    cell.offerTitle.text = @"";
else
    call.offerTitle.text = value;

id value = [voucherData objectForKey:@"offer_title"];
cell.offerTitle.text = [value isKindOfClass:[NSNull class]] ? @"" : value;

答案 1 :(得分:0)

此处最佳做法的一个候选人是使用isEqual:,而不是isEqualToString:。这样,如果你得到的不是一个字符串,你将不会得到错误,并且相等测试将失败。

另一方面,你可以说isEqualToString:是一个不错的选择,因为当你得到的不是一个字符串时,你会收到一个错误提醒你这个问题!

编辑:但那是错的;见下面的评论。 isEqualToString:消息来自UIKit,而不是来自OP自己的代码。

答案 2 :(得分:0)

我为诺亚的回答做了一些改变

-(NSDictionary*)safeData:(NSDictionary*)dict{
    NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithDictionary:dict];
    NSArray *keys = dictionary.allKeys;
    for (int i = 0; i < keys.count; i++){
        id value = [dictionary objectForKey:[keys objectAtIndex:i]];
        // you can add recursive here
        value = [value isKindOfClass:[NSNull class]] ? @"" : value;
        [dictionary setObject:value forKey:[keys objectAtIndex:i]];
}
    return dictionary; }

并使用

dictionary = [self safeData:dictionary];

答案 3 :(得分:-1)

来自控制台的那一行可能告诉您“voucherData”不是您认为的“NSDictionary”对象。

同时确保您的单元格中的“offerTitle”也是有效的UITextField