问题
i creating a search bar which should behave like iPhones contact search bar.currently it does partially. here is my code
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
NSRange whiteSpaceRange = [result rangeOfCharacterFromSet:[NSCharacterSet whitespaceCharacterSet]];
if (whiteSpaceRange.location != NSNotFound)
{
NSString * stringAfterSpace = [result substringFromIndex:whiteSpaceRange.location];
NSString * stringBeforeSpace= [result substringToIndex:whiteSpaceRange.location];
NSPredicate *predicateForAfterSpace=[NSPredicate predicateWithFormat:@"catNm CONTAINS[cd] %@",stringAfterSpace];
NSPredicate *predicateForBegining = [NSPredicate predicateWithFormat:@"catNm BEGINSWITH[cd] %@", stringBeforeSpace];
NSPredicate *compoundPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[predicateForBegining, predicateForAfterSpace]];
searchArray = [[dataArray filteredArrayUsingPredicate:compoundPredicate] mutableCopy];
}
else
{
NSPredicate *predicateForBegining = [NSPredicate predicateWithFormat:@"catNm BEGINSWITH[cd] %@", result];
NSString *stringAfterSpace=[NSString stringWithFormat:@" %@",result];
NSPredicate *predicateForAfterSpace=[NSPredicate predicateWithFormat:@"catNm CONTAINS[cd] %@",stringAfterSpace];
NSPredicate *compoundPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:@[predicateForBegining,predicateForAfterSpace]];
searchArray = [[dataArray filteredArrayUsingPredicate:compoundPredicate] mutableCopy];
}
}
the main difference is my searchBar handles one incomplete keyword but not more than one.suppose array={{catNm=@"Asus Zenfone 3 Max"},{catNm=@"Asus Zenfone Go}}
if i search asu zen
or zen ma
then it shows result but if search for asus zen max
then it goes wrong
All i want to know is how handle multiple spaces in searchBar
回答1:
Here is something you can use: Regular Expression (Regex).
NSString *keyToFilter = @"catNm";
NSArray *dataArray = @[@{keyToFilter: @"Asus Zenfone 3 Max"},
@{keyToFilter: @"Asus Zenfone Go"}];
NSArray *wordsSearched = [searchString componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
NSMutableString *pattern = [[NSMutableString alloc] initWithString:@".*\\b"];
[pattern appendString:[wordsSearched componentsJoinedByString:@".*\\b"]];
[pattern appendString:@".*"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.%K MATCHES[C] %@", keyToFilter, pattern];
NSArray *filtered = [dataArray filteredArrayUsingPredicate:predicate];
NSLog(@"SearchString: %@\nFiltered: %@", searchString, ([filtered count]?[filtered valueForKey:keyToFilter]:@"NO RESULT"));
I'm not very confident with regex, but that should do it. You can use online RegexTools if you want to add more complex stuffs.
Results/Sample Test:
$>SearchString: "asus zen max"
Filtered: (
"Asus Zenfone 3 Max"
)
$>SearchString: "zen ma"
Filtered: (
"Asus Zenfone 3 Max"
)
$>SearchString: "asu zen"
Filtered: (
"Asus Zenfone 3 Max",
"Asus Zenfone Go"
)
$>SearchString: "zen"
Filtered: (
"Asus Zenfone 3 Max",
"Asus Zenfone Go"
)
$>SearchString: "M"
Filtered: (
"Asus Zenfone 3 Max"
)
$>SearchString: "sams"
Filtered: NO RESULT
$>SearchString: "zen asu"
Filtered: NO RESULT
$>SearchString: "zen g"
Filtered: (
"Asus Zenfone Go"
)
$>SearchString: "a g"
Filtered: (
"Asus Zenfone Go"
)
来源:https://stackoverflow.com/questions/42156932/how-to-make-search-bar-as-iphone-contact-app-or-search-bar-which-handles-more-th