@interface TableViewAppDelegate : NSObject <UIApplicationDelegate> { UIWindow *window; UINavigationController *navigationController; } @property (nonatomic, retain) IBOutlet UIWindow *window; @property (nonatomic, retain) IBOutlet UINavigationController *navigationController; @end #import "TableViewAppDelegate.h" #import "RootViewController.h" @implementation TableViewAppDelegate @synthesize window; @synthesize navigationController; #pragma mark - #pragma mark Application lifecycle - (void)applicationDidFinishLaunching:(UIApplication *)application { // Override point for customization after app launch [window addSubview:[navigationController view]]; [window makeKeyAndVisible]; } - (void)applicationWillTerminate:(UIApplication *)application { // Save data if appropriate } #pragma mark - #pragma mark Memory management - (void)dealloc { [navigationController release]; [window release]; [super dealloc]; } @end @interface RootViewController : UITableViewController <UISearchBarDelegate>{ NSDictionary *movieTitles; NSArray *years; //---search--- IBOutlet UISearchBar *searchBar; BOOL isSearchOn; BOOL canSelectRow; NSMutableArray *listOfMovies; NSMutableArray *searchResult; } @property (nonatomic, retain) NSDictionary *movieTitles; @property (nonatomic, retain) NSArray *years; //---search--- @property (nonatomic, retain) UISearchBar *searchBar; - (void) doneSearching: (id)sender; - (void) searchMoviesTableView; @end #import "RootViewController.h" @implementation RootViewController @synthesize movieTitles, years; @synthesize searchBar; - (void)viewDidLoad { NSString *path = [[NSBundle mainBundle] pathForResource:@"Movies" ofType:@"plist"]; NSDictionary *dic = [[NSDictionary alloc] initWithContentsOfFile:path]; self.movieTitles = dic; NSArray *array = [[movieTitles allKeys] sortedArrayUsingSelector:@selector(compare:)]; self.years = array; [dic release]; //---display the searchbar--- self.tableView.tableHeaderView = searchBar; searchBar.autocorrectionType = UITextAutocorrectionTypeYes; //---copy all the movie titles in the dictionary into the listOfMovies array--- listOfMovies = [[NSMutableArray alloc] init]; for (NSString *year in array) //---get all the years--- { //---get all the movies for a particular year--- NSArray *movies = [movieTitles objectForKey:year]; for (NSString *title in movies) { [listOfMovies addObject:title]; } } //---used for storing the search result--- searchResult = [[NSMutableArray alloc] init]; isSearchOn = NO; canSelectRow = YES; [super viewDidLoad]; } //---fi red when the user taps on the searchbar--- 光标聚焦 - (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar { isSearchOn = YES; canSelectRow = NO; self.tableView.scrollEnabled = NO; //---add the Done button at the top--- self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneSearching:)] autorelease]; } //---done with the searching--- 点击done按钮 - (void) doneSearching:(id)sender { isSearchOn = NO; canSelectRow = YES; self.tableView.scrollEnabled = YES; self.navigationItem.rightBarButtonItem = nil; //---hides the keyboard--- [searchBar resignFirstResponder]; //---refresh the TableView--- [self.tableView reloadData]; } //---fi red when the user types something into the searchbar--- 有值输入 - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { //---if there is something to search for--- 改变cell值 和 去掉tableView section(通过预先设定好的标志) if ([searchText length] > 0) { isSearchOn = YES; canSelectRow = YES; self.tableView.scrollEnabled = YES; [self searchMoviesTableView]; } else { //---nothing to search--- isSearchOn = NO; canSelectRow = NO; self.tableView.scrollEnabled = NO; } [self.tableView reloadData]; } - (void) searchMoviesTableView { //---clears the search result--- [searchResult removeAllObjects]; //过滤搜索结果 for (NSString *str in listOfMovies) { //指定开始 匹配的location 和最大匹配长度 //NSRange r; // r.location = 0; // r.length = 2; NSRange titleResultsRange = [str rangeOfString:searchBar.text options:NSCaseInsensitiveSearch range:r]; NSLog(@"%@ %d %d",str,titleResultsRange.length,titleResultsRange.location); if (titleResultsRange.length > 0) [searchResult addObject:str]; } NSLog(@"%d",[searchResult count]); } ///---fi red when the user taps the Search button on the keyboard--- - (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar { [self searchMoviesTableView]; } - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { if (isSearchOn) return 1; else return [years count]; } // Customize the number of rows in the table view. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { if (isSearchOn) { return [searchResult count]; } else { NSString *year = [years objectAtIndex:section]; NSArray *movieSection = [movieTitles objectForKey:year]; return [movieSection count]; } } // Customize the appearance of table view cells. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; } // Configure the cell. if (isSearchOn) { NSString *cellValue = [searchResult objectAtIndex:indexPath.row]; cell.textLabel.text = cellValue; } else { NSString *year = [years objectAtIndex:[indexPath section]]; NSArray *movieSection = [movieTitles objectForKey:year]; cell.textLabel.text = [movieSection objectAtIndex:[indexPath row]]; } return cell; } // 分区标题 - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { NSString *year = [years objectAtIndex:section]; if (isSearchOn) return nil; else return year; } // tableView 右侧索引 - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView { if (isSearchOn) return nil; else return years; } //---fired before a row is selected--- cell是否可选 - (NSIndexPath *)tableView :(UITableView *)theTableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath { if (canSelectRow) return indexPath; else return nil; } - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } - (void)viewDidUnload { // Release anything that can be recreated in viewDidLoad or on demand. // e.g. self.myOutlet = nil; } - (void)dealloc { [years release]; [movieTitles release]; [searchBar release]; [super dealloc]; } @end