2013-03-04 2 views
0

Я работаю над проектом, где я загружаю весь беспорядок JSON, а затем вынимаю из него довольно UITableView.NSPredicate filtering of NSMutableArray sub NSDictionaries

У меня JSON разобрался в хороший NSMutableArray, который я потом загрузил в UITableView. Все работает и выглядит красиво.

Проблема, с которой я столкнулась, заключается в том, что у моего NSMutableArray есть объект словаря, который я хочу использовать для фильтрации фильтрации в tableview.

Это является NSLog объекта в NSMutableArray, что я смотрю на:

{ 
id = 123456; 
    issues =  (
       { 
      id = 4; 
      name = "Ape"; 
     }, 
       { 
      id = 25; 
      name = "Chimp"; 
     }, 
       { 
      id = 28; 
      name = "Human"; 
     } 
    ); 
status = open; 
} 

То, что я хочу написать предикат фильтра на любой из колонки имен в вопросах словаря в NSMutableArray ,

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@", @"name", @"Human"]; 
NSArray *predicateFilteredArray = [tableViewArray filteredArrayUsingPredicate:predicate]; 

Однако я не могу определить правильный формат предикатной переменной, которая будет соответствовать именам в проблемах. Я прочитал и перечитал руководство по программированию Predicate и около половины элементов переполнения стека, помеченных NSPredicate, и я не могу понять синтаксис. Я пробовал много вариаций SELF, и я просто устарел.

+0

Помог ли мой ответ? Пожалуйста, дайте мне знать, если вам нужна дополнительная информация. –

ответ

2

Если я правильно понял проблему правильно, следующий предикат должен работать:

[NSPredicate predicateWithFormat:@"ANY issues.name == %@", @"Human"] 

Это дает все объекты из массива, в котором по крайней мере один из «вопросов» имеет «имя», которое равно " Человек".

+0

Я пробовал это решение, но это не сработало для меня. Не могли бы вы проверить, что я сделал не так [здесь] (http://stackoverflow.com/questions/26480703/filtering-nsmutablearray-of-nsdictionary-with-nspredicate)? – NAZIK

0

Я написал библиотеку методов категорий, называемую Linq to ObjectiveC, что делает эту вещь немного проще. Из того, что я могу собрать, у вас есть массив элементов, где каждый элемент имеет свойство, называемое issues, которое само является массивом?

Если вы хотите, чтобы найти все элементы, которые имеют проблему с названием «Human», вы можете выполнить следующие действия:

NSArray* matches = [inputArray where:^BOOL(id item) { 
    return [[item issues] any:^BOOL(id issue) { 
     return [[issue name] equalTo:@"Human"]; 
    }]; 
}] 

Это использует Linq для ObjectiveC where и any методов.

Смежные вопросы