2015-08-17 2 views
1

Все, я пытаюсь сделать следующее, не получая результата и не уверен, где я ошибаюсь. В моем случае srchString будет передан из searchDisplayController, чтобы строка поиска была динамической. Просто потому, что черт его пробовал жестко кодировать значение, как в приведенном ниже примере, и он ничего не возвращал. Так что ищите некоторую помощь в решении этой проблемы. СпасибоПоиск NSArray из NSDictionary с использованием NSPredicate

(
{ 
     amount = "-243.77"; 
     date = "May 21, 2014"; 
     description = "Preauthorized Debit"; 
     extraMap =    { 
      MEMO = "ATT    Payment"; 
      RUNBAL = "$100,159.51"; 
      id = 123456789454444440000002 
     }; 
     longDate = "2014-05-22"; 
     referenceId = " "; 
     sortDate = "2014-05-22 04:00:00 +0000"; 
     transactionDateAsCal = "1432267200000:America-New_York"; 
    }, 
    { 
     amount = "5058.74"; 
     date = "May 21, 2014"; 
     description = "Deposit"; 
     extraMap =    { 
      MEMO = "WXYZAWQH   BATCH"; 
      RUNBAL = "$100,159.51"; 
      id = 124259821201505220000001; 
     }; 
     longDate = "2014-05-22"; 
     referenceId = " "; 
     sortDate = "2014-05-22 04:00:00 +0000"; 
     transactionDateAsCal = "1432267200000:America-New_York"; 
    } 
) 

NSArray *listOfKeys = [[NSArray alloc]initWithObjects:@"amount", @"date", @"description", @"memo", @"runbal", @"referenceId",@"longDate", @"id", nil]; 

//Sample test. This search string will be passed from the searchDisplayController. 
NSString *srchString = @"Preauthorized"; 

//If the searchstring has an exact match then it works Like below 
//NSString *srchString = @"Preauthorized Debit"; 

NSMutableArray *subpredicates = [NSMutableArray array]; 
for (NSString *key in listOfKeys) { 
    NSPredicate *subpredicate = [NSPredicate predicateWithFormat:@"%K contains[cd] %@", key, srchString]; 
    [subpredicates addObject:subpredicate]; 
} 

NSPredicate *resultPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:subpredicates]; 
NSLog(@"predicate %@",resultPredicate); 

NSArray *tempArr = [transactionList filteredArrayUsingPredicate:resultPredicate]; 
NSLog(@"tempArr %@", tempArr); 
+0

Вашей фильтрующей transactionList но это не называется где-нибудь в вашем коде. Наверное, почему это ничего не возвращает. Кроме того, ваш вызов предиката, который находится внутри цикла – soulshined

+0

transactionList - это в основном образец NSArray, который я перечислял выше. Вероятно, должен был уточнить, что ... прошу об этом. – user1657861

+0

Ваш предикат не может быть достигнут ResultPredicate, потому что он находится в цикле. – soulshined

ответ

0

Хорошо, так как ваш неактивен с комментариями Я отправлю ответ. Обычно я не люблю делать это, если я не уверен, о чем просит ОП, в этом случае я предполагаю, что я уверен, что понимаю ваше видение. Сначала давайте поговорим о том, что происходит с вашим примером ... и отвлеките часть «жесткого кодирования», которую вы поделили, я думаю, что это просто путает будущих искателей вопросов из-за грамматических ошибок и осложнений.

Первой вещи, вы используете %K для одного предиката, %K является Arg заменой вара для ключевого пути. В вашем случае вы заявили, что у вас есть массив словарей, что в конечном итоге означает, что это массив, который не соответствует требованиям KVO, ergo, не будет работать.

Во-вторых,, вам не нужна петля вообще, на самом деле я бы не стал поощрять ее к вашим обстоятельствам. Его можно легко отфильтровать только с одним предикатом.

Так позволяет сумму это для вас, так и для будущих вопросительных убежища:

Допустим, мы имеем NSArrayNSDictionary из, как указано выше. Например, мы будем использовать данные ОП, приведенных выше:

NSArray *firstTransactionKeys = [NSArray arrayWithObjects:@"amount",@"date",@"description",@"longdate", nil]; 
NSArray *firstTransactionValues = [NSArray arrayWithObjects:@"-243.77",@"May 21, 2014",@"Preauthorized Debit",@"2014-05-22 04:00:00", nil]; 
NSArray *secondTransactionKeys = [NSArray arrayWithObjects:@"amount",@"date",@"description",@"longdate", nil]; 
NSArray *secondTransactionValues = [NSArray arrayWithObjects:@"5058.74",@"May 21, 2014",@"Deposit",@"2014-05-22 04:00:00", nil]; 

NSArray *transactionList = [NSArray new]; 
transactionList = [NSArray arrayWithObjects:[NSDictionary dictionaryWithObjects:firstTransactionValues forKeys:firstTransactionKeys], [NSDictionary dictionaryWithObjects:secondTransactionValues forKeys:secondTransactionKeys], nil]; 
NSLog(@"Original Transactions: %@", transactionList); 

(
    { 
     amount = "-243.77"; 
     date = "May 21, 2014"; 
     description = "Preauthorized Debit"; 
     longdate = "2014-05-22 04:00:00"; 
    }, 
     { 
     amount = "5058.74"; 
     date = "May 21, 2014"; 
     description = Deposit; 
     longdate = "2014-05-22 04:00:00"; 
    } 
) 

Теперь, когда у нас есть данные, которые мы хотим, все, что нам нужно сделать, это с кодом дружественный формат, фильтровать массив до ключевого слова или поиска термин:

///////Example purposes only. User types in 'Preauthorized Debit'//////// 
NSString *searchWord = @"Preauthorized Debit"; 

Теперь просто использовать NSPredicate с% @ (вар арг для стоимости объекта).

NSPredicate *searchPredicate = [NSPredicate predicateWithFormat:@"SELF contains[cd] %@", searchWord]; 

Создание нового массива из предиката:

NSArray *tempArr = [transactionList filteredArrayUsingPredicate:searchPredicate]; 
NSLog(@"tempArray = %@", tempArr); 

И это, надеюсь, что поможет вам немного понять вещи

+1

ok cool. Спасибо, сэр. – user1657861

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