SearchDisplayController поиск в нескольких массивах

Ладно, после долгих поисков, колебаний и новых поисков, я просто не могу понять это.

У меня есть 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 поступают из индексов 1,3 и 4 из price_producttitle (исходного массива), то я могу использовать эти числа для indexPath.row, чтобы показать. По крайней мере, это мой план на данный момент, сделать массив searchResult, содержащий числа, которые должны использоваться в objectAtIndex при создании ячейки.

Я борюсь с этим, я не могу найти никаких примеров, где они ищут в нескольких массивах, потому что ячейки составлены из нескольких массивов.

Может кто-нибудь дать мне подсказку в хорошем направлении или примеры, которые я могу использовать?

Заранее спасибо.

Prastow

Ссылки, которые я использовал:

SearchDisplayController поиск нескольких массивов

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

2 ответа

Решение

Хотя никто не ответил на мой вопрос, я понял это сам.

На самом деле, я думал, что слишком сложно. Я хотел использовать 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 поиск нескольких массивов

Я взял этот метод и реализовал его в -(void) viewtableview. Я должен отметить, что вопросов по этому поводу не так много, и это был единственный подходящий ответ, который я смог найти.

Я надеюсь, что другие тоже найдут это полезным!

-(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];
}
Другие вопросы по тегам