ios - 如何将搜索栏制作成 iPhone 联系人应用程序或处理多个不完整关键字的搜索栏

标签 ios objective-c uisearchbar predicate

我创建了一个搜索栏,它的行为应该像 iPhone 的联系人搜索栏。目前它只做部分。 这是我的代码

-(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];
        }
}

主要区别是我的 searchBar 处理一个不完整的关键字但不超过一个。假设 array={{catNm=@"Asus Zenfone 3 Max"},{catNm=@"Asus Zenfone Go}} 如果我搜索 asu zenzen ma 然后它显示结果但是如果搜索 asus zen max 然后它出错 我只想知道如何处理 searchBar 中的多个空格

最佳答案

这里有一些你可以使用的东西:正则表达式(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"));

我对正则表达式不是很有信心,但应该可以。如果您想添加更复杂的东西,您可以使用在线 RegexTools。

结果/样本测试:

$>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"
)

关于ios - 如何将搜索栏制作成 iPhone 联系人应用程序或处理多个不完整关键字的搜索栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42156932/

相关文章:

ios - UIView 动画阻止触摸事件?

ios - Firebase 客户端应用程序

ios - NSNotificationCenter 使我的应用程序崩溃

ios - 在 UISearchBar 中添加按钮

iOS - 如何使导航栏的 subview 透明?

iphone - 如何使用 iPhone SDK 3.0 中的 UISearchDisplayController 实现始终位于顶部的搜索栏

ios - 获取 BLE 设备的响应

ios - 在 iOS 上禁用下拉控制/通知中心

ios - 使用 iOS ClassGuard 混淆 iOS 项目

iphone - 任何基于 Windows 的 IDE 来查看 objective-c 代码?