2015-04-16 18 views
5

Ho un array che contiene array di dizionario e stringa e voglio filtrare con il valore di dizionario, ma quando sto facendo il filtro sto ottenendo risultato solo quando digito la prima lettera in campo di testo ho scritto questo codice per la ricerca nspredicate anche io ho allegato screenshot per NSarry contenente valori che io uso per il filtraggio.Array di filtri di dizionario e stringa

Ecco il codice per la serie la ricerca:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string; // return NO to not change text 
{ 

    NSString * searchStr = [textField.text stringByReplacingCharactersInRange:range withString:string]; 

    NSLog(@"%@",searchStr); 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains[c] %@ ",searchStr]; 
    NSArray *filteredArr = [arrmainData filteredArrayUsingPredicate:predicate]; 
    detailListArray=[[NSMutableArray alloc]initWithArray:filteredArr]; 
    [tblGlosary reloadData]; 

    return true; 
} 

Ecco ScreenSnap per serie

enter image description here

risposta

0

Hai una matrice di tipi misti (NSString e NSDictionary), che è generalmente un davvero male idea (e non sarà possibile in Swift).

Se per qualche motivo non può controllare questo e la necessità di filtrare attraverso di essa è necessario verificare che si confrontano in modo corretto a seconda del tipo di realtà:

NSIndexSet *matches = [arrmainData indexesOfObjectsPassingTest:BOOL^(id obj, NSUInteger idx, BOOL *stop) { 
    NSString *stringToCompare = nil; 

    if ([obj isKindOfClass:[NSString class]]) { 
     stringToCompare = (NSString *)obj; 
    } else { 
     NSDictionary *dict = (NSDictionary *)obj; 
     stringToCompare = dict["Name"]; 
    } 

    return [stringToCompare rangeOfString:searchString].location != NSNotFound; 
}]; 

NSArray *filteredArray = [arrmainData objectsAtIndexes:matches]; 

Ma ancora una volta, se si può, davvero riconsiderare mescolando i tipi nello stesso array, è probabile che porti a problemi lungo la strada.