Iphone 使用不同密钥的NSDictionary中密钥的访问值
花了大约一周的时间使用stackoverflows搜索,但运气不好 以下是我所拥有的: 1 plist:Iphone 使用不同密钥的NSDictionary中密钥的访问值,iphone,objective-c,ios,nsdictionary,Iphone,Objective C,Ios,Nsdictionary,花了大约一周的时间使用stackoverflows搜索,但运气不好 以下是我所拥有的: 1 plist: <plist version="1.0"> <array> <dict> <key>name</key> <string>Name 1</string> <key>abrev</key> <string>(HG
<plist version="1.0">
<array>
<dict>
<key>name</key>
<string>Name 1</string>
<key>abrev</key>
<string>(HGB, ΗbA)</string>
<key>picture</key>
<string>first.png</string>
<key>pictureHeight</key>
<integer>1686</integer>
</dict>
<dict>
<key>name</key>
<string>Name 2</string>
<key>abrev</key>
<string> </string>
<key>picture</key>
<string>second.png</string>
<key>pictureHeight</key>
<string>396</string>
</dict>
<dict>
...
<dict>
</array>
</plist>
名称
名字1
阿布雷夫
(HGB,ΗbA)
照片
first.png
图片重量
1686
名称
名称2
阿布雷夫
照片
second.png
图片重量
396
...
问题是:如何返回键“picture”和“pictureHeight”的值
知道键“name”的值 我尝试过这样的事情,但是失败了
//creating an array that contains the plist
dictArray = [[NSArray alloc] initWithContentsOfFile:[[NSBundle mainBundle]
pathForResource:@"table1" ofType:@"plist"]];
//creating an array that contains only the vlaues for key "name"
NSMutableArray *temp = [dictArray valueForKey:@"name"];
//searchedData - an NSMutableArray containing the "name" values that
//the user searched using the searchbar
for (i=0; i<[searchedData count]; ++i)
{
if ([searchedData containsObject:[temp objectAtIndex:i]])
{
[temp removeObjectAtIndex:i];
}
}
//创建包含plist的数组
dictArray=[[NSArray alloc]initWithContentsOfFile:[[NSBundle mainBundle]
pathForResource:@“table1”,其类型为:@“plist”]];
//创建仅包含键“name”的值的数组
NSMutableArray*temp=[dictArray valueForKey:@“name”];
//searchedData—一个NSMutableArray,其中包含
//用户使用搜索栏进行搜索
对于(i=0;i使用NSPredicate和NSArray的-filteredArrayUsingPredicate:方法选择数组中键“name”的值与您要查找的内容匹配的字典。然后,您可以使用通常的方式查询结果字典,即使用objectForKey:
NSPredicate非常强大,值得您花时间学习使用它,但它确实需要一些研究。如果您想要实现更简单但不那么优雅的东西,只需自己迭代数组即可:
NSMutableArray *matches = [NSMutableArray array];
for (NSDictionary *d in searchedData) {
if ([name isEqualToString: [d objectForKey:@"name"]]) {
[matches addObject:d];
}
}
同样,您最终会得到一个数组,其中包含“name”与您要查找的名称匹配的词典,并且您可以以通常的方式获取它们的其他属性。使用NSPredicate和NSArray的-filteredarrayingpredicate:方法选择数组中键“name”的值与您要查找的内容匹配的词典。然后,您可以使用通常的方式查询结果字典,即使用objectForKey:
NSPredicate非常强大,值得您花时间学习使用它,但它确实需要一些研究。如果您想要实现更简单但不那么优雅的东西,只需自己迭代数组即可:
NSMutableArray *matches = [NSMutableArray array];
for (NSDictionary *d in searchedData) {
if ([name isEqualToString: [d objectForKey:@"name"]]) {
[matches addObject:d];
}
}
同样,您最终会得到一个数组,其中包含“name”与您要查找的名称匹配的词典,并且您可以以通常的方式获取它们的其他属性。Caleb!非常感谢您提供了完美的答案!我已经查找了一些有关NSpredicate的信息,而这正是我所缺少的!我甚至会查看所有其他应用程序以优化它他用它在那里编写代码。这真是一件非常强大的事情!祝你好运,再次感谢你为我指明了方向!另外,还要感谢你的第二个决定!:)太好了——我很高兴我能帮上忙你也可以用d[@“name”]替换[d objectForKey:@“name”]。@Yu SenHan你现在可以了,但是Objective-C在2011年我写这个答案时不支持这一点。但是,是的,新的对象文字语法很棒。Caleb!非常感谢你的完美回答!我查了一些关于NSpredicate的信息,这正是我所缺少的!我甚至会检查我的所有其他应用程序,用它优化那里的代码。这真是一个非常强大的东西!祝你好运,再次感谢你为我指明了方向!p、 (对第二个决定表示额外的感谢!)太好了,我很高兴能帮上忙你也可以用d[@“name”]替换[d objectForKey:@“name”]。@Yu SenHan你现在可以了,但是Objective-C在2011年我写这个答案时不支持这一点。但是,是的,新的对象文字语法很棒。