значение доступа для ключа в NSDictionary с использованием другого ключа - PullRequest
1 голос
/ 07 марта 2011

Потратил около недели, используя поиск в 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>

Вопросы:
Как вернуть значения для ключей "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];
    }
}

В конце у меня есть массив значений для ключа "name", и мне нужно получить "picture" и "pictureHeight", чтобы передать всю эту информацию в контроллер следующего представления ...

Я ищу какие-нибудь свежие идеи (или, возможно, учебные пособия), потому что я не захожу слишком далеко с моими ...

1 Ответ

4 голосов
/ 07 марта 2011

Используйте NSPredicate и NSFray -filteredArrayUsingPredicate: метод для выбора словарей в массиве, где значение для ключа 'name' совпадает с тем, что вы ищете. Затем вы можете запросить полученный словарь или словари обычным способом, то есть, используя objectForKey:.

NSPredicate является очень мощным и стоит времени, которое потребуется вам, чтобы научиться его использовать, но оно требует некоторого изучения. Если вы хотите что-то более простое в реализации, но менее изящное, просто итерируйте массив самостоятельно:

NSMutableArray *matches = [NSMutableArray array];
for (NSDictionary *d in searchedData) {
    if ([name isEqualToString: [d objectForKey:@"name"]]) {
        [matches addObject:d];
    }
}

Опять же, вы получите массив, содержащий словари, чье «имя» соответствует имени, которое вы ищете, и вы можете получить их другие атрибуты обычным способом.

...