Iphone 使用不同密钥的NSDictionary中密钥的访问值

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

花了大约一周的时间使用stackoverflows搜索,但运气不好

以下是我所拥有的:

1 plist:

<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年我写这个答案时不支持这一点。但是,是的,新的对象文字语法很棒。