Как использовать UISearchBar для пользовательских ячеек в UITableView

#iphone #objective-c #xcode #uitableview #uisearchbar

#iPhone #objective-c #xcode #uitableview #uisearchbar

Вопрос:

Я заполняю свой tableview из массива. И этот массив создается запросом SQLite.
Итак, в моем массиве у меня есть объекты из моего пользовательского класса.
И я использую пользовательские ячейки в своей таблице. Как object.name в одном слое, object.id рядом с этим слоем. Пока все хорошо. Но если я попытаюсь использовать UISearchBar, как я буду повторно заполнять свою таблицу?

Это код, с помощью которого я создаю свою таблицу.

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"SpeakersCell";

    SpeakersCell *cell = (SpeakersCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"SpeakersCell" owner:self options:nil];

        for (id currentObject in topLevelObjects) {
            if ([currentObject isKindOfClass:[SpeakersCell class]]) {
                cell = (SpeakersCell *) currentObject;
                break;
            }
        }
    }

    // Set up the cell
    ProjectAppDelegate *appDelegate = (ProjectAppDelegate *)[[UIApplication sharedApplication] delegate];
    Speaker *speakerObject = (Speaker *)[appDelegate.speakers objectAtIndex:indexPath.row];

    cell.lblSpeakerName.text = speaker.speakerName;
    cell.lblSpeakerCity.text = speaker.speakerCity;
    return cell;
}
  

Когда я добавляю панель поиска и определяю searchBar textDidChange событие, я успешно получаю элементы, содержащие ключевые буквы. Но я не могу повторно заполнить свою таблицу, потому что у меня есть только имена элементов поиска.

Учебные пособия, из которых я получил помощь, построены на ячейках по умолчанию, а источником данных tableview является массив NSString. Но мой массив — это массив NSObject, это моя проблема.

Я рассматриваю возможность получения индексов искомых элементов, но как я могу использовать эти значения? У вас есть какие-либо идеи или какие-либо связанные ссылки?

Ответ №1:

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

http://www.cocoabob.net/?p=67

Проверьте его функцию делегирования для UISearchDisplayController (которую, я думаю, вы, возможно, захотите использовать?)

 - (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
   [self.filteredListContent removeAllObjects];
    for (Product *product in listContent)
  {
    if ([scope isEqualToString:@"All"] || [product.type isEqualToString:scope])
     {
        NSComparisonResult result = [product.name compare:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) range:NSMakeRange(0, [searchText length])];
        if (result == NSOrderedSame)
        {
         [self.filteredListContent addObject:product];
         }
      }
   }
}
  

У него есть массив NSObject ( product ), который он перебирает. Каждый раз, когда результат совпадает со строкой поиска, он помещает значение во второй вызываемый массив filteredListContent и отображает отфильтрованное содержимое. Для меня это просто прелесть.

Комментарии:

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

2. По какой-то причине я пошел другим путем, но еще раз спасибо за ответ.

3. Я лучше напишу статью на свою личную домашнюю страницу, потому что потребовалось много времени, чтобы понять и собрать все вместе. Тогда я мог бы поделиться ссылкой, отредактировав свой пост. Если вам это нужно, я, конечно, могу отправить его вам.

4. Нет, мне это не нужно, но было бы здорово узнать, как вы это решили. Вы знаете, для будущих ссылок с курса и других, у которых может возникнуть такая же проблема при переполнении стека.

5. И вот он, 2013 год. Вы уже закончили свою статью? Где сообщение?