使用iOS中的searchDisplay控制器搜索单词或字符的任意组合

时间:2012-04-23 21:56:42

标签: iphone ios uitableview uisearchbar uisearchdisplaycontroller

您好我有一个填充tableview的主数组,我有一个筛选数组用于搜索结果。使用以下方法,这两种方法都可以正常工作。我的tableview和搜索显示数组运行良好,除了此代码块下的以下问题。

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope

{

[self.filteredListContent removeAllObjects]; // First clear the filtered array.



for (product *new in parserData)
{

    //Description scope
   if ([scope isEqualToString:@"Description"]) 

    {
        NSRange result = [new.description rangeOfString:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch)];

        if (result.location != NSNotFound)
        {
            [self.filteredListContent addObject:new];
        }
    }


    //Product scope
    if ([scope isEqualToString:@"Product"])

    {
        NSRange result = [new.item rangeOfString:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch)];

        if (result.location != NSNotFound)
        {
            [self.filteredListContent addObject:new];
        }
    }
}

}

我想要实现的是这个。我在主阵列中有一个名为 LMD-2451 TD专业3D液晶显示器的项目。我可以搜索道明专业版道明专业版道主,并使用任何案例返回上述正确的项目。但是,如果我搜索 Pro TD ,则不会显示任何结果。我面临的问题是用户可能不知道产品标题或描述的顺序?所以我需要实现一些逻辑上可行的东西。我真的很想做什么。

供参考

NSMutableArray * parserData; //完成主完整数组 NSMutableArray * filteredListContent; //搜索结果的数组

任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:2)

如何在搜索字符串上使用componentsSeperatedByString:@" "将其拆分为(在您的示例中)包含2个字符串@"Pro"@"TD"的数组。然后使用rangeOfString:检查数组中的所有组件是否在new.item中找到。

//Product scope
if ([scope isEqualToString:@"Product"])
{
    // Split into search text into separate "words"
    NSArray * searchComponents = [searchText componentsSeparatedByString: @" "];
    BOOL foundSearchText = YES;

    // Check each word to see if it was found
    for (NSString * searchComponent in searchComponents) {
        NSRange result = [new.item rangeOfString:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch)];
        foundSearchText &= (result.location != NSNotFound);
    }

    // If all search words found, add to the array
    if (foundSearchText)
    {
        [self.filteredListContent addObject: new];
    }
}