Как фильтровать NSArray с использованием предиката для свойства объекта
-(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
и filteredArray
являются NSArray
s.
hotelArray
имеет объекты типа hotel
, где hotel
имеет свойство name
.
Проблема:
Я хочу, чтобы фильтр hotelArray
в соответствии с hotel.name
, когда hotel.name
соответствует тексту, введенному в searchText
[текстовое поле], но я получаю пустой self.filteredArray
.
Ответы
Ответ 1
Попробуйте выполнить следующие строки и убедитесь, что properyName
чувствителен к регистру. и вы поместили ,
в предикатный формат, вот почему он не работает. просто замените свой код следующим.
Цель C
NSPredicate *bPredicate = [NSPredicate predicateWithFormat:@"SELF.name contains[cd] %@",self.searchText.text];
self.filteredArray = [self.hotelArray filteredArrayUsingPredicate:bPredicate];
NSLog(@"HERE %@",self.filteredArray);
Swift
var bPredicate: NSPredicate = NSPredicate(format: "SELF.name contains[cd] %@", self.searchText.text)
self.filteredArray = self.hotelArray.filteredArrayUsingPredicate(bPredicate)
NSLog("HERE %@", self.filteredArray)
С помощью быстрого filter
var searchText = "Galaxy"
let filteredArray = hotelArray.filter { $0["name"] == searchText }
print("** Result ** \n\(filteredArray)")
Swift 3.0
let arrEmp = [["name": "James", "age" : 27, "city" : "New york"],
["name": "Johnson", "age" : 24, "city" : "London"],
["name": "Alex", "age" : 28, "city" : "Newark"],
["name": "Mark", "age" : 25, "city" : "Paris"],
["name": "Steve", "age" : 25, "city" : "Silicon Valley"],
["name": "Lary", "age" : 28, "city" : "New york"]]
// *** Filter by Name exact match ***
var filterByName = arrEmp.filter { $0["name"] == "Mark" }
print("filterByName \(filterByName)")
// *** Filter by Age ***
var filterByAge = arrEmp.filter { $0["age"] as! Int > 25 }
print("filterByAge \(filterByAge)")
Swift 4.0
var filterByName = arrEmp.filter
do {
$0["name"] == "Mark"
}
print("filterByName filterByName)")
var filterByAge = arrEmp.filter
do {
$0["age"] as! Int > 25
}
print("filterByAge filterByAge)")
Ответ 2
Основываясь на вашей информации, это ваша ситуация:
self.hotelArray // Array in which we perform a search
self.filteredArray // Result array
name // Property of the object used for the predicate
Этот предикат должен работать для вас:
NSString *searchText = self.searchText.text;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self.name contains[c] %@", searchText];
self.filteredArray = [self.hotelArray filteredArrayUsingPredicate:predicate];
Ответ 3
Это метод предиката, который может работать для вас.
-(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.
}
содержит [c] - означает предикат с чувствительным к регистру.
содержит [cd] - строка без учета регистра
Ответ 4
Оформить заказ этой библиотеки
https://github.com/BadChoice/Collection
Он поставляется с множеством простых функций массива, чтобы никогда не писать цикл снова
Итак, вы можете просто сделать:
NSArray* hotels = [self.hotelArray filter:^BOOL(Hotel *hotel) {
[return hotel.name isEqualToString:searchText];
}];
или просто
NSArray* hotels = [self.hotelArray where:@"name" is:searchText];
:)
Ответ 5
Я не уверен, что это то, что вы хотите сделать:
-(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;
}