对于访问数组中的可变字典感到困惑

时间:2012-11-19 20:07:52

标签: ios nsmutablearray nsmutabledictionary

我在这里遗漏了一些东西而且我知道它并不难,但我没有得到它。我有一本词典。它被加载到一个可变数组中,然后填充我的tableView。

plist样本:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
    <dict>
        <key>title</key>
        <string>entry1</string>
        <key>checkedState</key>
        <string>NO</string>
    </dict>
    <dict>
        <key>title</key>
        <string>accessoriesImage</string>
        <key>checkedState</key>
        <string>NO</string>
    </dict>
    <dict>
        <key>title</key>
        <string>activationCharge</string>
        <key>checkedState</key>
        <string>NO</string>
    </dict>

我试图访问这些字典值,但我感到困惑。

这是我的初始化:

static NSString *kTitleKey = @"title";
static NSString *kCheckedState = @"checkState";

@interface ViewController ()

@end

@implementation ViewController

@synthesize attributesTableView, attributesArray;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nil bundle:nil];
    if (self) {
        NSString *attributesFile = [[NSBundle mainBundle] pathForResource:@"attributesPlist"ofType:@"plist"];

        attributesArray = [[NSMutableArray alloc] initWithContentsOfFile:attributesFile];

    }
    return self;
}

跳到相关位,我用:

填充我的tableView单元格
cell.textLabel.text = [[attributesArray objectAtIndex:[indexPath row]] valueForKey:kTitleKey];

稍后在didSelectRowAtIndexPath中我尝试检查那些字典值以及我失败的地方。

示例:

if ([[attributesArray valueForKey:kTitleKey = @"All"] valueForKey:kCheckedState = @"YES"]) {
                        [attributesArray setValue:kCheckedState = @"NO" forKey:@"All"];

[attributesArray setValue:kCheckedState = @"YES" forKey:[[attributesArray objectAtIndex:[indexPath row]] valueForKey:kTitleKey]];

我收到此错误: valueForUndefinedKey:]:此类不符合键值,因为键码是YES。&#39;

我知道我只是错误地访问了它,但当我使用填充了可变字典的可变数组时,我不确定我是怎么做到的。

1 个答案:

答案 0 :(得分:2)

我认为您设置值的语法已关闭。在您发布的最后一个代码段中,您有:

[attributesArray valueForKey:kTitleKey = @"All"]

与您的想法相反,这并未将标题设置为“全部”;相反,它用字符串“All”替换kTitleKey 的值,然后从attributes数组中获取“All”的值。相反,我认为你想要这样的东西:

[attributesArray setValue:@"All" forKey:kTitleKey]

您必须在最后一个示例中进行类似的更新。请记住这里的关键区别:

  • valueForKey: 获取值。你永远不能使用valueForKey:设置某些内容,即使你输入了一些等号。
  • setValue:forKey: 设置值。您需要在需要更改attributesArray时使用此功能。

您可能需要阅读key-value coding以获取更多信息。