首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SearchDisplayController搜索多个数组

SearchDisplayController搜索多个数组
EN

Stack Overflow用户
提问于 2011-11-17 15:37:25
回答 2查看 524关注 0票数 1

目前,我正在使用表示名称、id等的多个数组的内容填充表视图单元格。

当我开始使用搜索显示控制器时,我的问题就来了。我有一个数组,其中包含一个名称列表、一个I列表、一个条形码列表和一个别名列表。当用户在搜索栏中输入时,我需要能够搜索所有4个数组。当它在1个数组中找到结果时,它必须将结果与其他3个数组配对。

示例

  1. 名称(苹果、胡萝卜、香蕉、狗)
  2. 别名(红色、橙色、黄色、棕色)
  3. 条形码(1,2,10,20)
  4. id (30,40,50,60)

因此,如果用户输入"a“,我应该使用Apple、胡萝卜、Banana和相关别名、条形码、id填充表视图。

如果用户输入2,我只能得到胡萝卜和狗。

如果用户输入0,我将得到所有这些项目。

有什么办法做到这一点吗?

更新:我就是这样做的。

代码语言:javascript
复制
    -(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {

    BOOL shouldReturn = FALSE;
    [searchResults removeAllObjects];

    for (int i = 0; i < [itemIDRows count]; i++) {

        BOOL foundResult = FALSE;

        if ([[itemIDRows objectAtIndex:i] rangeOfString:searchString].location != NSNotFound) {
            foundResult = TRUE;
        }
        if ([[nameRows objectAtIndex:i] rangeOfString:searchString].location != NSNotFound) {
            foundResult = TRUE;
        }
        if ([[barcodeRows objectAtIndex:i] rangeOfString:searchString].location != NSNotFound) {
            foundResult = TRUE;
        }
        if ([[aliasRows objectAtIndex:i] rangeOfString:searchString].location != NSNotFound) {
            foundResult = TRUE;
        }
        if (foundResult) {
            NSNumber *result = [NSNumber numberWithInt:i];
            if ([self searchResults] == nil) {
                NSMutableArray *array = [[NSMutableArray alloc] init];
                [self setSearchResults:array];
                [array release];
            }
            [searchResults addObject:result];
            shouldReturn = YES;
        }
    }
    return shouldReturn;    
}

然后,当我填充桌面视图时,我会做这样的事情

代码语言:javascript
复制
if ([tableView isEqual:self.searchDisplayController.searchResultsTableView]) { 
    [cell setCellContentsName:[NSString stringWithFormat:@"%@", [nameRows objectAtIndex:[[searchResults objectAtIndex:indexPath.row] integerValue]]];  
} else {
    [cell setCellContentsName:[NSString stringWithFormat:@"%@", [nameRows objectAtIndex:indexPath.row]];
}

但是,当我键入类似于9999的内容时,它会弹出只有19在ID或条形码中的实例。有什么办法解决这个问题吗?

UPDATE2:通过让列表始终刷新来解决问题,而不是只在找到结果时重新加载数据。现在它工作得很好:D

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-17 15:57:27

搜索显示控制器调用

代码语言:javascript
复制
  UISearchDisplayDelegate 

方法:

代码语言:javascript
复制
 searchDisplayController:shouldReloadTableForSearchString:

在这个方法中,您需要实现您的逻辑。这个逻辑需要搜索所有4个数组中的命中点,并进行适当的查找(即从橙色到胡萝卜,或者从50到香蕉)。每次你被击中时,我都会把它放进NSMutableSet (以防止欺骗)。然后,在搜索完所有数组后,将集合复制到表的数据源读取的数组中。

如果您想向用户显示给定行为什么是命中(即输入50并获得香蕉),则必须在表单元格中显示所有4个属性。你需要突出那个匹配的部分。如果这样做,我将创建一个小容器类,类似于包含所有4个属性的"searchHit“,以及一个标志,它的属性得到了命中,可能还有得到命中的属性的子字符串(例如,您可以为这个子字符串使用黄色背景)。然后,tableView的数据源将有一个要显示的这些searchHit对象的数组,您的cellForRowAtIndexPath将需要解码这个对象并适当地显示命中。

票数 0
EN

Stack Overflow用户

发布于 2011-11-17 16:01:14

您可以使用NSPredicate使用KVC对象来完成这一任务。

创建对KVC方案的NSObject响应http://theocacao.com/document.page/161。你可以用财产来做这个。

使用NSPredicate http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSPredicate_Class/Reference/NSPredicate.html筛选数组

代码语言:javascript
复制
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self.name LIKE[cd] %@ OR self.alias LIKE[cd] %@",searchString,searchString];
NSArray *result = [baseArray filteredArrayUsingPredicate:predicate];
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8169889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档