2011-05-01 21 views
15

Tengo una matriz de contactos donde cada contacto es un diccionario.Buscando NSArray de objetos NSDictionary

Cada contacto tiene una clave "contact_type" que es un NSNumber. El tipo de contacto básicamente representa si es un contacto de Facebook, LinkedIn o Correo, etc. Tengo una matriz de búsqueda que contiene solo NSNúmero de tipo de contacto.

Lo que quiero es crear una matriz temporal de contactos que deseo buscar utilizando mi matriz de búsqueda.

Tengo problemas para usar NSPredicate para crear una matriz de contactos buscados. ¿Puede alguien guiarme sobre cómo hacerlo?

Respuesta

37
NSArray *contacts = ...; //your array of NSDictionary objects 
NSPredicate *filter = [NSPredicate predicateWithFormat:@"contact_type = 42"]; 

NSArray *filteredContacts = [contacts filteredArrayUsingPredicate:filter]; 

Después de esto, filteredContacts contendrá sólo los contactos cuyo contact_type es 42.

Si necesita buscar más de un tipo de contact_type, a continuación, sólo tiene que utilizar un OR en el predicado:

filter = [NSPredicate predicateWithFormat:@"contact_type = 42 OR contact_type = 23"]; 
+0

Hola, gracias por la respuesta. pero estoy buscando la búsqueda de más de un tipo de contacto ... Encontré la solución. – Satyam

+0

@Satyam svv: Acabo de actualizar mi respuesta. –

+0

Gracias de nuevo. Publiqué la solución que es similar a la tuya, pero la solución más exacta que estoy buscando. – Satyam

1

Este trabajo solución fresca para mí.

// NSDictionary Formato

{ 
18=(
    { 
     content="Great Avijit", 
     id=abc 
    } 
), 
13=(
    { 
     content="Stack Overflow is cool", 
     id=abc 
     } 
), 
} 

// Paso 1

-(void)filterContentForSearchText:(NSString *)searchText 
    { 
     [self.filterResultArray removeAllObjects]; 

     NSPredicate *namePredicate = [NSPredicate predicateWithFormat:@"(content contains[cd] %@)", searchText];//from_user.name 
      //other 

     for (NSMutableDictionary *key in self.messageAll) { 

      NSArray *array=[self.messageAll objectForKey:key]; 
       array=[array filteredArrayUsingPredicate:namePredicate]; 

      if ([array count]==0) { 
        [self.filterResultArray removeObject:key]; 
      } 
      else{ 

       if ([self.filterResultArray containsObject:key]) { 

       } 
       else{ 
         [self.filterResultArray addObject:key]; 
       } 

      } 

     } 


     //Reload table view 
     [self.tableView reloadData]; 

    } 

// Paso 2: numberOfRowsInSection

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 


    if (self.searchController.active && ![self.searchController.searchBar.text isEqualToString:@""]) { 
     return [self.filterResultArray count]; 
    }else{ 
     return [keyArray count];//keyArray hold all key of original dict 
    } 

} 

// Paso 3: En el método cellForRowAtIndexPath

NSString *key = [self.filterResultArray objectAtIndex:indexPath.row]; 
    NSDictionary *dictionary = [[self.messageAll objectForKey:key] lastObject];//self.messageAll is original dict 
0

La respuesta de Dave anterior es perfecta, solo agrego aquí lo que aprendí después de pasar 3 horas de mi sueño nocturno.

Cuando usted está tratando de buscar los valores de cadena dentro de una matriz diccionario años tienen que usar algo como esto predicado:

NSPredicate *filter = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"Title CONTAINS[cd] '%@' OR Description CONTAINS[cd] '%@'", searchText, searchText]]; 

No se olvide de embalar sus valores con '', este fue el único que me costó todo el tiempo. Aquí está mi función de búsqueda final

-(void)searchTerm : (NSString*)searchText { 
    if (searchText!=nil && searchText.length) { 
     NSPredicate *filter = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"Title CONTAINS[cd] '%@' OR Description CONTAINS[cd] '%@'", searchText, searchText]]; 
     self.reasonDetailArray = [self.unfilteredReasonDetailArray filteredArrayUsingPredicate:filter]; 
    }else{ 
     self.reasonDetailArray = self.unfilteredReasonDetailArray; 
    } 
    [self.tableView reloadData]; 
} 
Cuestiones relacionadas