how to make search bar as iPhone contact app Or search bar which handles more than one incomplete kewords

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-08 07:33:28

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!