UISearchBar поиск двух массивов - PullRequest
2 голосов
/ 15 февраля 2012

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

The titles and authors

В данный момент панель поиска ищет только заголовки, но я бы хотел, чтобы она также выполняла поиск по авторам. Вот код поиска, который у меня есть (я получил от 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» - это массив, в котором хранятся ячейки, которые должны появиться на экране (ячейки, содержащие искомые термины).

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

Люк

Ответы [ 3 ]

8 голосов
/ 16 февраля 2012

Я бы изменил массив 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, а не со строками заголовка.

1 голос
/ 05 августа 2014
-(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];
}
0 голосов
/ 17 декабря 2015
- This is Helpful when you search from Dictionary.

NSMutableArray *contentList;
NSMutableArray *filteredContentList;
BOOL isSearching;

// firstSection is array which already filled.
// contentList array for value of particular key
// filteredContentList is search array from actual array.

  - (void)searchTableList {
        NSString *searchString = searchBar.text;

        NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"frame_code beginswith[c] %@", searchString];
        NSArray *filteredArr = [firstSection filteredArrayUsingPredicate:filterPredicate];
        if(contentList.count > 0)
            [contentList removeAllObjects];
        [filteredContentList addObjectsFromArray:filteredArr];
    }

    - (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar1 {

        if ([searchBar1.text length] != 0)
            isSearching = YES;
        else
            isSearching = NO;
    }

    - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
        NSLog(@"Text change - %d",isSearching);

        //Remove all objects first.
        [filteredContentList removeAllObjects];

        if([searchText length] != 0) {
            isSearching = YES;
            [self searchTableList];
        }
        else {
            isSearching = NO;
        }
        [tblFrameList_SComplete reloadData];
    }

    - (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {
        NSLog(@"Cancel clicked");
    }

    - (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
        NSLog(@"Search Clicked");
        [self searchTableList];
    }
...