UISearchBar ищет два массива

У меня есть панель поиска, которая выполняет поиск в массиве и обновляет UITableView с результатами. Табличное представление представляет собой список книг с названиями и авторами:

Заголовки и авторы

Прямо сейчас панель поиска выполняет поиск только по заголовкам, но я бы хотел, чтобы она также выполняла поиск по авторам. Вот код поиска, который у меня есть (я получил его от http://blog.webscale.co.in/?p=228).

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    [tableData removeAllObjects];// remove all data that belongs to previous search
    if([searchText isEqualToString:@""]||searchText==nil){
        [tableView reloadData];
        return;
    }

    for(NSString *name in dataSource){
         NSInteger counter = 0;

        //NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
        NSRange r = [[name lowercaseString] rangeOfString:[searchText lowercaseString]];
        if(r.location != NSNotFound)
            [tableData addObject:name];


            counter++;
    }
        //[pool release];


    [tableView reloadData];

}

dataSource - это массив NSMutable, содержащий заголовки. массив, содержащий авторов, называется «автор». tableData - это массив, в котором хранятся ячейки, которые должны появиться на экране (ячейки, содержащие искомые термины).

Большое спасибо,

Люк


person Luke Baumann    schedule 15.02.2012    source источник


Ответы (1)


Я бы изменил массив dataSource, чтобы он содержал как заголовки, так и авторов, создав NSDictionary с парами значений ключа (лучше класс Book).

//Do this for each book
NSDictionary * book = NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
    title, @"TITLE", author, @"AUTHOR", nil];
[dataSource addObject:book];

После этого вы можете изменить метод поиска для работы с NSDictionary.

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

    [tableData removeAllObjects];

    if(searchText != nil && ![searchText isEqualToString:@""]){

        for(NSDictionary * book in dataSource){
            NSString * title = [book objectForKey:@"TITLE"];
            NSString * author = [book objectForKey:@"AUTHOR"];

            NSRange titleRange = [[title lowercaseString] rangeOfString:[searchText lowercaseString]];
            NSRange authorRange = [[author lowercaseString] rangeOfString:[searchText lowercaseString]];

            if(titleRange.location != NSNotFound || authorRange.location != NSNotFound)
                [tableData addObject:book];
            }

    }

    [tableView reloadData];
}

Обратите внимание, что с помощью этого метода вы можете изменить свой метод cellForRowAtIndexPath для работы с NSDictionary, а не со строками заголовка.

person Joel Kravets    schedule 15.02.2012
comment
идеальный ответ @Joel Kravets - person Jashu; 17.03.2016