【问题标题】:boolForKey unrecognized selector error iOSboolForKey无法识别的选择器错误iOS
【发布时间】:2012-03-08 12:58:49
【问题描述】:

我正在从 plist 文件中读取到数组中。当我遍历数组时,我将每个字符串保存到数据结构的相应部分。当我到达 BOOL 变量并尝试 boolForKey 从数组中提取它时,我得到一个无法识别的选择器错误。

这里有一些代码:

for(int i = 0; i<myArray.count;i++){

[myDataStructure setName:[[myArray objectAtIndex:i] objectForKey:NAMEVAR_KEY]];
//works fine
....
[myDataStructure setABoolVar:[[myArray objectAtIndex:i] boolForKey:BOOLVAR_KEY]];
//crash
.... 
}

数据结构中的属性是这样的: @property(nonatomic, strong) NSString* 名称; @property(nonatomic) BOOL aBoolVar;

//synthesized etc....

在 plist 中,该属性被列为布尔值,如果我使用 objectForKey 会收到警告但它不会崩溃。

有什么想法吗?

这是 XML

<dict>
<key>Root</key>
<array>
    <dict>
        <key>name</key>
        <string>Bobby</string>
        <key>aBoolValue</key>
        <true/>

    </dict>
....
    </array>
</dict>

....

从控制台

2012-02-16 23:45:21.866 CSOTest4[1452:f803] -[__NSCFDictionary boolForKey:]: unrecognized selector sent to instance 0x6d296a0
2012-02-16 23:45:21.867 CSOTest4[1452:f803] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary boolForKey:]: unrecognized selector sent to instance 0x6d296a0'
*** First throw call stack:
(0x13c2052 0x1553d0a 0x13c3ced 0x1328f00 0x1328ce2 0x3980 0xdf64e 0xdec1c 0x10556d 0xefd47 0x106441 0x10645d 0x10645d 0x1064f9 0x46d65 0x46dac 0x17be6 0x188a6 0x27743 0x281f8 0x1baa9 0x12acfa9 0x13961c5 0x12fb022 0x12f990a 0x12f8db4 0x12f8ccb 0x182a7 0x19a9b 0x2618 0x2575 0x1)

【问题讨论】:

  • 请发布您遇到的错误的确切文本

标签: ios xcode plist boolean


【解决方案1】:

NSDictionary 没有名为boolForKey 的方法。你必须先使用objectForKey,它会给你一个NSNumber,然后在NSNumber上调用boolValue

BOOL myBool = [[[myArray objectAtIndex:i] objectForKey:BOOLVAR_KEY] boolValue];

或将其分解成碎片:

NSDictionary myDictionary = [myArray objectAtIndex:i];
NSNumber myNumber = [myDictionary objectForKey:BOOLVAR_KEY];
BOOL myBool = [myNumber boolValue];

【讨论】:

  • 两种解决方案都有效,我希望我能分担功劳。现在我得到一个选择器错误的原因是有道理的,但它编译正常而没有警告。那是让我失望的部分。有时,如果代码在没有警告的情况下编译,它似乎会起作用。情况并非总是如此。
  • @j_mcnally 您可能应该尝试编辑您的答案,以便它包含您在 cmets 中达到的解决方案。否则看起来解决方案只是使用 YES 而不是 true。
  • 我很困惑为什么我不能单独使用 objectForkey: 从布尔 plist 字段中获得有用的值。读完这个答案后,我仍然不明白为什么它不仅可以工作,但至少我的代码现在可以工作了。
【解决方案2】:

您的 PLIST 中的布尔值是否应该为 YES 而不是 True?

这行得通

[myDataStructure setABoolVar:([(NSDictionary*) 
        [myArray objectAtIndex:i]valueForKey:BOOLVAR_KEY]== 
                                        [NSNumber numberWithBool:YES]?YES:NO)];

【讨论】:

  • 现在设置为 YES,让我试试 TRUE。
  • 没有做任何事情,当您在 xcode 上的 plist 中键入 TRUE 时,它会自动将其设为 YES。但我认为无论如何尝试都很聪明
  • 尝试将数组结果转换为 NSDictionary [myDataStructure setABoolVar:[(NSDictionary *)[myArray objectAtIndex:i] boolForKey:BOOLVAR_KEY]];
  • 构建失败;接收器类型 NSDictionary 例如消息敌人未使用选择器 boolForKey 声明方法
  • 使用 valueForKey 而不是 boolForKey,据我所知,您只能将对象存储在 NSDictionary 中,因此布尔值将转换为 NSNumber。所以你可能会得到一个 1 或 0 的 NSNumber,但总比没有好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多