我收到以下错误
-[NSNull isEqualToString:]: unrecognized selector sent to instance 0x3c168090
在这行代码上
cell.offerTitle.text = [voucherData objectForKey:@"offer_title"];
有人可以帮我纠正这个问题吗?
谢谢奥利弗
我收到以下错误
-[NSNull isEqualToString:]: unrecognized selector sent to instance 0x3c168090
在这行代码上
cell.offerTitle.text = [voucherData objectForKey:@"offer_title"];
有人可以帮我纠正这个问题吗?
谢谢奥利弗
是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;
这里最佳实践的一个候选者是使用isEqual:
,而不是isEqualToString:
. 这样,如果你得到的不是一个字符串,你就不会得到一个错误,并且相等性测试会以良好的顺序失败。
另一方面,您可能会争辩说这isEqualToString:
是一个不错的选择,因为当您得到的不是字符串时,您会收到一个警告您该问题的错误!
编辑:但那是错误的;请参阅下面的评论。该isEqualToString:
消息来自 UIKit,而不是来自 OP 自己的代码。
我为诺亚的回答做了一些改变
-(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];
控制台中的那一行可能会告诉您“ voucherData
”不是NSDictionary
您假设的“”对象。
还要确保offerTitle
您的单元格中的“”也是有效UITextField
的。