【问题标题】:Converting NSDate to NSString causes unrecognized selector exception将 NSDate 转换为 NSString 会导致无法识别的选择器异常
【发布时间】:2013-04-13 23:09:39
【问题描述】:

我将 NSDate 作为字符串存储在 plist 中,并且在启动时我试图将字符串从 plist 转换回 NSDate 以便稍后进行比较。

这就是我在 plist 中存储值的方式:

[InfoDic setValue:[NSDate date] forKey:@"LastDate"];

在日志中(当我将 [NSDate date] 转换为正确的字符串时)它说:

2013-04-13 22:47:57 +0000

这就是我尝试将 plist 值转换回 NSDate 的方式:

NSString *Checkdate= [InfoDic objectForKey:@"LastDate"];
NSDateFormatter *DateFormat=[[NSDateFormatter alloc]init];
[DateFormat setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];
NSDate *theday=[DateFormat dateFromString:Checkdate];

这是我的 iPhone 4S 上的错误日志:

<Error>: -[__NSDate length]: unrecognized selector sent to instance 0x1d8715e0
<Error>: *** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '-[__NSDate length]: unrecognized selector sent to instance 0x1d8715e0'
    *** First throw call stack:
(0x31e5c2a3 0x39b7997f 0x31e5fe07 0x31e5e531 0x31db5f68 0x327c213d 0x327c208d 0x327c237b 0x23fe1 0x33c83595 0x33cc3d79 0x33cbfaed 0x33d011e9 0x2385d 0x33cc4ad9 0x33cc4663 0x33cbc84b 0x33c64c39 0x33c646cd 0x33c6411b 0x3597a5a3 0x3597a1d3 0x31e31173 0x31e31117 0x31e2ff99
0x31da2ebd 0x31da2d49 0x33cbb485 0x33cb8301 0x235a1 0x23528)

请注意,当我在我的设备上安装应用程序时,它会获取第一个日期并将其存储在 plist 中。当我关闭应用程序并重新运行它时,它会给我 SIGABRT。

我该怎么办?

【问题讨论】:

    标签: cocoa cocoa-touch nsdate nsdateformatter


    【解决方案1】:

    您不是将日期作为字符串存储在 plist 中,而是将其存储为日期。

    行:

    [InfoDic setValue:[NSDate date] forKey:@"LastDate"];
    

    存储实际的NSDate 对象。

    您只需致电:

    NSDate *theDay = InfoDic[@"LastDate"];
    

    顺便说一句 - 行:

    [InfoDic setValue:[NSDate date] forKey:@"LastDate"];
    

    应该是:

    [InfoDic setObject:[NSDate date] forKey:@"LastDate"];
    

    或者只是:

    InfoDic[@"LastDate"] = [NSDate date];
    

    【讨论】:

    • 也谢谢你!这非常有帮助,我希望当我给另一个答案“接受答案打勾”时我不会冒犯你,因为他在评论部分为我解释了它。
    【解决方案2】:

    你把事情复杂化了。是什么让您认为存储NSDate 对象会返回NSString

    做事

    NSDate * checkDate = [InfoDic objectForKey:@"LastDate"];
    

    另外,不要将KVC 方法与NSDictionary 方法混淆。

    如果你不想面对糟糕的意外,你想使用setObject:forKey: 而不是setValue:forKey

    【讨论】:

    • 我想,因为 plists 键“LastDate”是一个字符串(因为我在 Plist 编辑器中将它编辑为一个字符串)
    • 保持一致。如果要存储字符串,请使用日期格式化程序将日期转换为字符串并执行此操作。您不能仅仅因为您在 plist 编辑器中设置了类型,就期望日期会自动转换为字符串。
    • @MauriceA。如果你想存储一个日期并取回一个日期,不要经历将日期显式转换为字符串的麻烦。只需使用日期。仅仅因为您在查看原始 plist 文件时将日期视为字符串并不意味着它被存储为字符串。您看到的字符串应该包含在 &lt;date&gt; 元素中。
    • @MauriceA。就像 rmaddy 说的,你得到你所给予的。存储日期,返回日期。存储一个字符串,取回一个字符串。尽可能简单。
    猜你喜欢
    • 2018-02-15
    • 1970-01-01
    • 2013-03-31
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    相关资源
    最近更新 更多