当我使用isEqualToDate时出现“无法识别的选择器”错误:[NSDate date]使用NSXMLParser获取日期信息

问题描述:

在我的项目中,我使用NSXMLParser从XML字符串中获取日期列表。解析器将信息放入的对象(称为DatesXML)具有许多其他属性之间的对象当我使用isEqualToDate时出现“无法识别的选择器”错误:[NSDate date]使用NSXMLParser获取日期信息

@property (nonatomic,strong) NSDate *DATE; 
@property (nonatomic,strong) NSString *NAME; 

我的解析器将返回DatesXML对象的数组(称为dateItemsFromXML)。解析器结束后,我做

NSMutableDictionary *datesFromXMLDictionary = [[NSMutableDictionary alloc] init]; 
for (DatesXML *item in dateItemsFromXML) 
{ 
    [datesFromXMLDictionary setValue:item.DATE forKey:item.NAME]; 
} 

后来,我做

if ([[datesFromXMLDictionary objectForKey:@"OneOfMyNames"] isEqualToDate:[NSDate date]]) 

我对这个if说法得到一个“无法识别的选择”的错误。我放了一个断点,当我把po [datesFromXMLDictionary objectForKey:@"OneOfMyNames"]放在控制台中时,我得到了(id) ... 12/3/2012

为什么控制台告诉我它是一个id对象而不是NSDate对象?将这些信息放入字典(或其他任何地方)时是否会丢失信息?

+0

发布**完全**错误消息。并检查'item.DATE'的类。我想这是NSString,而不是NSDate。 –

+0

@MatthiasBauch:我不这么认为 - item是一个'DatesXML'对象,NAME属性在我的.h中声明为NSDate,所以应该确保它是一个NSDate对象,对吗?否则,它会抛出一个编译错误,说我发送一个字符串到'for'循环中的日期,在那里我创建字典,对吧? – GeneralMike

+1

它被声明为NSDate,但您可以将任何对象分配给该变量,并且我猜您分配了一个NSString。如果从NSArray,NSDictionary或任何其他返回'id'的方法获得NSString,您将不会收到编译器警告。 –

正如Matthias Bauch在评论中指出的那样,我的问题的根源是因为我的.DATE属性中有一个NSString。当解析器加载我的DatesXML对象时,默认情况下它将所有内容加载为字符串。因此,它使用一个字符串加载了我的.DATE属性(并且默默地这样做了),尽管.DATE应该是一个NSDate。

我把NSDateFormatter放到我的解析器中,将字符串从xml转换成NSDate,然后把NSDate放到我的.DATE属性中。这消除了我得到的错误,当我尝试在我的代码中的其他地方使用.DATE属性时,我得到了所有我期望的行为。