2

好的,经过长时间的搜索、犹豫和更多的搜索,我似乎无法弄清楚这一点。

我有一个 SearchDisplayController,我有四个不同的数组,我正在使用 NSPredicate 进行搜索,因为每个 UITableViewCell 都由 4 个字符串(标题、描述等)组成。

我现在有 4 个搜索数组、search_title、search_description 等,它们的填充方式如下:

- (void)filterContentForSearchText:(NSString*)searchText 
                             scope:(NSString*)scope
{
    NSPredicate *resultPredicate = [NSPredicate 
                                    predicateWithFormat:@"SELF contains[cd] %@",
                                    searchText];

    self.search_category = [self.temp_category filteredArrayUsingPredicate:resultPredicate];
    self.search_producttitle = [self.price_producttitle filteredArrayUsingPredicate:resultPredicate];
    self.search_type = [self.price_type filteredArrayUsingPredicate:resultPredicate];
    self.search_description = [self.price_description filteredArrayUsingPredicate:resultPredicate];

当我使用 NSLog(数组计数)时,我可以看到它正在工作,因为它在我输入搜索词时给出了每个数组的正确计数。

我的表格视图单元格如下所示:

if ([tableView isEqual:self.searchDisplayController.searchResultsTableView]){
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        cell.nameLabel.text = [self.search_producttitle objectAtIndex:[[searchResults objectAtIndex:indexPath.row] integerValue]];
        cell.priceLabel.text = [self.search_price objectAtIndex:[[searchResults objectAtIndex:indexPath.row] integerValue]];
        cell.descrLabel.text = [self.search_description objectAtIndex:[[searchResults objectAtIndex:indexPath.row] integerValue]];
        cell.IDLabel.text = [self.search_type objectAtIndex:[[searchResults objectAtIndex:indexPath.row] integerValue]];
    }
    else{
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        cell.nameLabel.text = [price_producttitle objectAtIndex:indexPath.row];
        cell.IDLabel.text = [price_type objectAtIndex:indexPath.row];
        cell.priceLabel.text = [price objectAtIndex:indexPath.row];
        cell.descrLabel.text = [price_description objectAtIndex:indexPath.row];

也许您已经可以看到我正在尝试做的事情。我现在从旧数组制作新数组,我称之为搜索数组。然而,这些数组是相互独立的(一个数组可能是空的,而另一个是研究结果)。我需要知道数据来自哪个索引,存储在那些搜索数组中。如果我知道 search_producttitle 中的数据来自 price_producttitle (原始数组)中的索引 1,3 和 4,那么我可以将这些数字用于 indexPath.row 来显示。至少,这是我现在的计划,制作一个 searchResult 数组,其中包含在制作单元格时应该在 objectAtIndex 中使用的数字。

我正在为此苦苦挣扎,我找不到他们在多个数组中搜索的任何示例,因为单元格是由多个数组组成的。

有人可以给我一个好的方向提示,或者我可以使用的例子吗?

先感谢您。

普拉斯托

我使用的参考资料:

SearchDisplayController 搜索多个数组

http://ygamretuta.me/2011/08/10/ios-implementing-a-basic-search-uisearchdisplaycontroller-and-interface-builder/

4

2 回答 2

1

虽然没有人回答我的问题,但我自己想通了。

其实,我想得太难了。我想使用 NSPredicate ,这在我的情况下是不必要的。我想先从 NSPredicate 得到一个字符串,然后比较字符串。我现在使用 rangeofstring,在每个 objectatindex 的循环中,我对每个数组都这样做。

如果在数组中找到它,则报告 YES 并且索引将被放入不同的数组中。这个数组将在稍后制作 UITableView 时使用,替换 indexPath.row。

[self.searchResults removeAllObjects];

for (int i = 0; i < [temp_category count]; i++) {
    BOOL foundResult = FALSE;

    if ([[temp_category objectAtIndex:i] rangeOfString:searchText].location != NSNotFound) {
        foundResult = TRUE;
    }
    if ([[price_producttitle objectAtIndex:i] rangeOfString:searchText].location != NSNotFound) {
        foundResult = TRUE;
    }
    if ([[price_type objectAtIndex:i] rangeOfString:searchText].location != NSNotFound) {
        foundResult = TRUE;
    }
    if ([[price_description objectAtIndex:i] rangeOfString:searchText].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];

    }
}

NSLog (@"array = %i", [searchResults count]);
NSLog(@"%@",searchResults);

我不相信这个答案。学分应该去:SearchDisplayController search multiple arrays

我采用了这种方法并在 -(void)searchtableview 中实现了它。我应该提一下,关于此的问题并不多,这是我能找到的唯一合适的答案。

我希望其他人也会发现这很有用!

于 2012-07-08T17:49:38.283 回答
0
-(void)searchBar:(UISearchBar *)searchBar1 textDidChange:(NSString *)searchText
{
if ([searchText length]==0)
    {
      temp_array1 =[array_Main1 mutableCopy];
      temp_array2 =[array_Main2 mutableCopy];
      temp_array3 =[array_Main3 mutableCopy];
    }
 else
    {
      [temp_array1 removeAllObjects];
      [temp_array2 removeAllObjects];
      [temp_array3 removeAllObjects];
       int g = 0;
       for (int i=0; i< array_Main1.count;i++)
        {
            NSRange Range1 = [[array_Main1 objectAtIndex:i] rangeOfString:searchText options:NSCaseInsensitiveSearch];
            NSRange Range2 = [[array_Main2 objectAtIndex:i] rangeOfString:searchText options:NSCaseInsensitiveSearch];
            NSRange Range3 = [[array_Main3 objectAtIndex:i] rangeOfString:searchText options:NSCaseInsensitiveSearch];
            if (Range1.location != NSNotFound ||  Range2.location != NSNotFound ||  Range3.location != NSNotFound )
            {
                [temp_array1 addObject:[array_Main1 objectAtIndex:g]];
                [temp_array2 addObject:[array_Main2 objectAtIndex:g]];
                [temp_array3 addObject:[array_Main3 objectAtIndex:g]];

            }
            g++;
        }
    }
[table reloadData];
}
于 2014-08-05T09:04:00.067 回答