2011-11-17 83 views
1

目前我填充我的tableviewcells与多个阵列的代表名称,ID等SearchDisplayController搜索多个阵列

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

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

因此,如果用户键入 “一个” 我应该填充表查看 苹果,胡萝卜,香蕉和相关的别名,条码,身份证。

如果用户输入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它带来了情况,其中只有1个9是在ID或条形码。任何想法如何解决这个问题?

UPDATE2: 通过让列表总是刷新来解决问题,而不是仅在找到结果时重新加载数据。现在,它完美的作品:d

回答

0

搜索显示控制器调用

UISearchDisplayDelegate 

方法:

searchDisplayController:shouldReloadTableForSearchString: 

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

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

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]; 
过滤您的阵列