ios - Cómo filtrar NSArray usando predicado en una propiedad de objeto




iphone objective-c (4)

Basado en su información, esta es su situación:

self.hotelArray      // Array in which we perform a search
self.filteredArray   // Result array
name                 // Property of the object used for the predicate

Este predicado debería funcionar para usted:

NSString *searchText = self.searchText.text;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self.name contains[c] %@", searchText];
self.filteredArray = [self.hotelArray filteredArrayUsingPredicate:predicate];
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
  [self.map removeAnnotations:self.map.annotations];
  if ([textField isEqual:self.searchText]) {
      NSPredicate *bPredicate = 
      [NSPredicate predicateWithFormat:@"name contains[c],  %@",self.searchText.text];

      self.filteredArray = [self.hotelArray filteredArrayUsingPredicate:bPredicate];
      NSLog(@" HEARE %@",self.filteredArray);
      [self markAllHotels];
  }
  return YES;
}

hotelArray y filteredArray son NSArray s.

hotelArray tiene objetos de tipo hotel donde el hotel tiene un name propiedad.

Problema: quiero filtrar hotelArray según hotel.name cuando hotel.name coincida con el texto ingresado en searchText [campo de texto], pero self.filteredArray un self.filteredArray vacío.


Este es el método de predicado que podría funcionar para usted.

-(void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
    [filteredContactArray removeAllObjects];

    NSArray *tempArray = [hotelArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"name contains[c] %@ OR name contains[cd] %@",searchText]];

    filteredArray = [NSMutableArray arrayWithArray:tempArray];//if you want the filtered array to be mutable or tempArray will work as as desired by you.
}

contiene [c] - significa el predicado con mayúsculas y minúsculas. contiene [cd] - cadena insensible a mayúsculas


No estoy seguro de si esto es lo que quieres hacer:

-(NSArray*)searchString:(NSString*)stringToSearch inArray:(NSArray*)myArray
{
    NSMutableArray* filtredArray = [[NSMutableArray alloc] init];
    for (NSString* elmnt in myArray)
    {
        if ([elmnt rangeOfString:stringToSearch].location != NSNotFound) [fitredArray addObject:elmnt];
    }
    return filtredArray;
}

Revisa esta biblioteca

https://github.com/BadChoice/Collection

Viene con muchas funciones de matriz fáciles para nunca volver a escribir un bucle

Así que solo puedes hacer:

NSArray* hotels = [self.hotelArray filter:^BOOL(Hotel *hotel) {
    [return hotel.name isEqualToString:searchText];
}];

o simplemente

NSArray* hotels = [self.hotelArray where:@"name" is:searchText];

:)





objective-c