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];
:)