目前,我正在使用表示名称、id等的多个数组的内容填充表视图单元格。
当我开始使用搜索显示控制器时,我的问题就来了。我有一个数组,其中包含一个名称列表、一个I列表、一个条形码列表和一个别名列表。当用户在搜索栏中输入时,我需要能够搜索所有4个数组。当它在1个数组中找到结果时,它必须将结果与其他3个数组配对。
示例
因此,如果用户输入"a“,我应该使用Apple、胡萝卜、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;
}然后,当我填充桌面视图时,我会做这样的事情
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
发布于 2011-11-17 15:57:27
搜索显示控制器调用
UISearchDisplayDelegate 方法:
searchDisplayController:shouldReloadTableForSearchString:在这个方法中,您需要实现您的逻辑。这个逻辑需要搜索所有4个数组中的命中点,并进行适当的查找(即从橙色到胡萝卜,或者从50到香蕉)。每次你被击中时,我都会把它放进NSMutableSet (以防止欺骗)。然后,在搜索完所有数组后,将集合复制到表的数据源读取的数组中。
如果您想向用户显示给定行为什么是命中(即输入50并获得香蕉),则必须在表单元格中显示所有4个属性。你需要突出那个匹配的部分。如果这样做,我将创建一个小容器类,类似于包含所有4个属性的"searchHit“,以及一个标志,它的属性得到了命中,可能还有得到命中的属性的子字符串(例如,您可以为这个子字符串使用黄色背景)。然后,tableView的数据源将有一个要显示的这些searchHit对象的数组,您的cellForRowAtIndexPath将需要解码这个对象并适当地显示命中。
发布于 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筛选数组
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self.name LIKE[cd] %@ OR self.alias LIKE[cd] %@",searchString,searchString];
NSArray *result = [baseArray filteredArrayUsingPredicate:predicate];https://stackoverflow.com/questions/8169889
复制相似问题