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
Ссылки, которые я использовал:
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];
}