对访问数组中的可变字典感到困惑
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"] && ...
的操作。以上是关于对访问数组中的可变字典感到困惑的主要内容,如果未能解决你的问题,请参考以下文章
对 ASP.NET Core 中的 Google OAuth 包感到困惑