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 Array。 包含作者的数组称为“作者”。 “tableData”是存储应出现在屏幕上的单元格的数组(包含要搜索的术语的单元格)。

非常感谢,

卢克

我会修改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而不是标题字符串。

 -(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 *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]; }