SearchDisplayController搜索多个数组

时间:2011-11-17 15:37:25

标签: iphone objective-c xcode nsarray uisearchdisplaycontroller

目前我正在使用代表名称,id等的多个数组的内容填充我的tableviewcells。

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

实施例

  1. 姓名(苹果,胡萝卜,香蕉,狗)
  2. 别名(红色,橙色,黄色,棕色)
  3. 条形码(1,2,10,20)
  4. id(30,40,50,60)
  5. 因此,如果用户键入“a”,我应该填充表视图 Apple,Carrot,Banana和相关的别名,条形码,id。

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

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

    任何想法如何实现这一目标?

    更新: 这就是我做到的。

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

    然后,当我填充tableview时,我会做这样的事情

    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的内容时,它会显示ID或条形码中只有1 9的实例。任何想法如何解决?

    UPDATE2: 通过使列表始终刷新而不是仅在找到结果时重新加载数据来解决问题。现在它完美无缺:D

2 个答案:

答案 0 :(得分:0)

搜索显示控制器调用

  UISearchDisplayDelegate 

方法:

 searchDisplayController:shouldReloadTableForSearchString:

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

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

答案 1 :(得分:0)

你可以使用KVC对象使用NSPredicate。

创建一个NSObject响应KVC方案http://theocacao.com/document.page/161。你可以使用属性。

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

过滤您的数组
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self.name LIKE[cd] %@ OR self.alias LIKE[cd] %@",searchString,searchString];
NSArray *result = [baseArray filteredArrayUsingPredicate:predicate];