Как реализовать SearchBar и контроллер отображения поиска в табличном представлении в Xib

У меня есть изменяемый массив со словарями. Я отображаю этот массив в табличном представлении.

Теперь я хочу реализовать поиск и отображение контроллера в виде таблицы. Как?

Любые предложения или код..

Здесь в моем массиве я показываю "имя" ключа в uitableview в алфавитном порядке.

[
        {
            "name": "Fish",
            "description": "sdhshs",
            "colorCode": null,
        },
        {
            "name": "fry",
            "description": "sdhshs",
            "colorCode": null,
        },
        {
            "name": "curry",
            "description": "sdhshs",
            "colorCode": null,
        }
    ],

2 ответа

Решение

Вот пример кода

NSMutableArray *filteredResult; // this holds filtered data source
NSMutableArray *tableData; //this holds actual data source

-(void) filterForSearchText:(NSString *) text scope:(NSString *) scope
{
    [filteredResult removeAllObjects]; // clearing filter array
    NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"SELF.restaurantName contains[c] %@",text]; // Creating filter condition
    filteredResult = [NSMutableArray arrayWithArray:[tableData filteredArrayUsingPredicate:filterPredicate]]; // filtering result
}

Методы делегирования

-(BOOL) searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
    [self filterForSearchText:searchString scope:[[[[self searchDisplayController] searchBar] scopeButtonTitles] objectAtIndex:[[[self searchDisplayController] searchBar] selectedScopeButtonIndex] ]];

    return YES;
}

-(BOOL) searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption
{
    [self filterForSearchText:self.searchDisplayController.searchBar.text scope:
 [[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:searchOption]];

    return YES;
}

В условии NSPredicate "@"SELF.restaurantName содержит [c] %@", текст" restaurantName "- это имя свойства, для которого необходимо выполнить фильтрацию. Если у вас есть только NSString в массиве источника данных, вы можете использовать как @ "SELF содержит [c]% @", текст

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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if(tableView == [[self searchDisplayController] searchResultsTableView])
    {
        return [filteredResult count];
    }
    else
    {
        return [tableData count];

    }

}

Сравните табличное представление, является ли оно фильтрованным табличным представлением или исходным табличным представлением, и соответственно установите делегат и источник данных для табличного представления. Обратите внимание, что searchDisplayController является доступным свойством для UIViewcontroller, и мы можем просто использовать его для отображения отфильтрованного результата.

Чтобы приведенный выше код работал, вам нужно использовать объект "Панель поиска и отображение поиска", если вы используете его в XIB или раскадровке

Другие вопросы по тегам