UISearchBar busca dos matrices

Tengo una barra de búsqueda que busca en una matriz y actualiza una UITableView con los resultados. La vista de la tabla es una list de libros, con títulos y autores:

Los títulos y autores

En este momento, la barra de búsqueda solo busca en los títulos, pero también quisiera search en los autores. Aquí está el código de búsqueda que tengo (lo obtuve de 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 es la matriz NSMutable que contiene los títulos. la matriz que contiene los autores se llama "autor". "tableData" es la matriz que almacena las celdas que deberían aparecer en la pantalla (las celdas que contienen los términos que se buscan).

Muchas gracias,

Luke

Yo modificaría la matriz de dataSource para contener tanto los títulos como los autores al crear un NSDictionary con pares de valores key (una class de libro sería mejor).

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

Después de eso, puedes cambiar tu método de búsqueda para que funcione con el 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]; } 

Tenga en count que al utilizar este método, tendría que cambiar el método cellForRowAtIndexPath para que funcione con el NSDictionary y no las cadenas de título.

 -(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]; } 
 - This is Helpful when you search from Dictionary. NSMutableArray *contentList; NSMutableArray *filtenetworkingContentList; BOOL isSearching; // firstSection is array which already filled. // contentList array for value of particular key // filtenetworkingContentList is search array from actual array. - (void)searchTableList { NSString *searchString = searchBar.text; NSPnetworkingicate *filterPnetworkingicate = [NSPnetworkingicate pnetworkingicateWithFormat:@"frame_code beginswith[c] %@", searchString]; NSArray *filtenetworkingArr = [firstSection filtenetworkingArrayUsingPnetworkingicate:filterPnetworkingicate]; if(contentList.count > 0) [contentList removeAllObjects]; [filtenetworkingContentList addObjectsFromArray:filtenetworkingArr]; } - (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. [filtenetworkingContentList 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]; }