Как искать больше, чем ключевое слово с UISearchBar - PullRequest
1 голос
/ 04 мая 2010

HI, Я успешно выполняю поиск в arrayTags с помощью следующего кода, где arrayTags - это массив полей каждого элемента XML с именем «tag». Проблема в том, что, скажем, тег содержит три слова: красный, белый, синий. Если я выполню поиск «красный» или «белый, синий» или что-то еще, что точно включено в элемент тега, все в порядке. Но если я ищу «красный белый», поиск ничего не даст. Практически, поиск возвращает результаты только в том случае, если я ищу именно то, что включено в arrayTags, а не непоследовательные слова. Вы знаете, как я могу решить эту проблему? Большое спасибо!

 - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{


     [resultArray removeAllObjects];

     NSString *cellTitle;
     for (cellTitle in arrayTags){

      NSString *stringa = cellTitle;
      NSRange range = [stringa rangeOfString:searchText];

      NSComparisonResult result = [cellTitle compare:searchText options:NSCaseInsensitiveSearch range:range];
      if (result == NSOrderedSame){

       int posizione = [arrayNames indexOfObjectIdenticalTo:cellTitle];

       [result Array addObject:[arrayNames objectAtIndex:posizione]];


      }
     }

     [self.tableView reloadData];
    }

1 Ответ

0 голосов
/ 04 мая 2010

Ваша проблема имеет два или три аспекта:

(1) Вы должны определить, что такое слово разделитель и что принадлежит слову, которое вы ищете. Например, «A, B» может означать «искать« A »и« B »», или это может означать «искать« A »и« _B »» («undescore» обозначает пробел) Возможно, вы хотите разделить searchText следующим образом:

NSArray *listItems = [searchText componentsSeparatedByCharactersInSet:
                      [characterSetWithCharactersInString:@", "]];

Возможно, вы хотите удалить пробельные символы из объектов listItems и пустые объекты из listItems впоследствии.

(2) Только после этого вы можете решить, как искать то, что вы получили на этапе (1), например, создав предикат, который ищет все объекты в listItems:

NSPredicate *inPredicate = [NSPredicate predicateWithFormat: @"SELF IN %@",
                           listItems];
NSArray* filteredArray = [arrayTags filteredArrayUsingPredicate:inPredicate];

Обратите внимание, что этот предикат чувствителен к регистру, поэтому создайте свой собственный для других требований!

(3) FilterArray, вероятно, должен быть членом вашего класса представления и является новым tableDataSource. Но есть несколько тонкостей, которые нужно решить: пустой текст поиска, переключение источника данных с фильтрованного на нефильтрованный контент и т. Д.

...