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

Posted

技术标签:

【中文标题】对访问数组中的可变字典感到困惑【英文标题】:Confused about accessing mutable dictionary inside an array 【发布时间】:2012-11-19 20:07:51 【问题描述】:

我在这里遗漏了一些东西,我知道这并不难,但我没有得到它。我有一个字典列表。它被加载到一个可变数组中,然后填充我的 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 的键值编码不兼容。'

我知道我只是在访问它时出错了,但是当我使用一个充满可变字典的可变数组时,我不确定我是如何做到这一点的。

【问题讨论】:

【参考方案1】:

我认为你设置值的语法是关闭的。在您发布的最后一个代码 sn-p 中,您有:

[attributesArray valueForKey:kTitleKey = @"All"]

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

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

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

valueForKey: 获取一个值。您永远无法使用 valueForKey: 设置某些内容,即使您输入了一些等号。 setValue:forKey: 设置一个值。每当您需要更改 attributesArray 时,您都需要使用它。

您可能想阅读key-value coding 以了解更多信息。

【讨论】:

不确定您的回答是否合理。在我上一个代码 sn-p 中,我正在测试 title = ALL 和 checkedState = YES。如果这是真的,我正在尝试将所有标题的 checkState 设置为 NO。然后,我将表中选择的行的 checkState 设置为 YES。两个不相关的功能,但都做类似的事情。 啊。在这种情况下,您的代码仍然有点偏离 - 回想一下,Objective-C 字符串相等性测试是通过调用 isEqualToString: 完成的,因此您可能会执行类似 if([[attributesArray valueForKey:kTitleKey] isEqualToString:@"All"] &amp;&amp; ... 的操作。

以上是关于对访问数组中的可变字典感到困惑的主要内容,如果未能解决你的问题,请参考以下文章

对 ASP.NET Core 中的 Google OAuth 包感到困惑

对删除分配给结构数组的动态内存感到困惑

对leal感到困惑。它是不是也访问内存地址的内容?

对 Yesod 中的 selectOneMany 感到困惑

对 SwiftUI 中的 @EnvironmentObject 感到困惑

对 Clojure 中的“let”感到困惑