模仿iphone手機通訊錄
項目之前實現了拼音排序 通訊錄的設計。現在給通訊錄增加搜索功能。
原界面如下:
搜索功能主要依靠 uisearchbar uisearchdisplaycontroller來實現
第一步 初始化:初始化searbar 和seardisplaycontroller 以及 對應的兩個數組(用來顯示全部結果以及搜索結果)還有對應的delegate
@interface ComunicationViewController (){ UISearchDisplayController *searchDisplayController; UISearchBar *searchBar; NSArray *allItems; NSArray *searchResults; }
searchBar = [[UISearchBar alloc] init]; searchBar.delegate = self; searchBar.placeholder = @"請輸入姓名"; [searchBar setAutocapitalizationType:UITextAutocapitalizationTypeNone]; [searchBar sizeToFit]; comunicationTabelView.tableHeaderView = searchBar; //comunicationTabelView.frame = CGRectMake(0, 0, 320, comunicationTabelView.frame.size.height); searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self]; [searchDisplayController setDelegate:self]; [searchDisplayController setSearchResultsDataSource:self]; [searchDisplayController setSearchResultsDelegate:self];第二步 一個匹配的方法 和2個delegate
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope { NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"SELF contains[cd] %@", searchText]; searchResults = [[allItems valueForKey:@"RealName"] filteredArrayUsingPredicate:resultPredicate]; [searchResults retain]; NSLog(@"%@",searchResults); } #pragma mark - UISearchDisplayController delegate methods -(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString { [self filterContentForSearchText:searchString scope:[[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]]; return YES; } - (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption { [self filterContentForSearchText:[self.searchDisplayController.searchBar text] scope:[[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:searchOption]]; return YES; }最重要的是加載時:tableview判斷
#pragma mark -comunicationTableView代理方法 //section中的row數 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { if (tableView == searchDisplayController.searchResultsTableView) { return searchResults.count; } else { return[[numArr objectAtIndex:section] intValue] ; } } //高度 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 50; } //section數 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { if (tableView == searchDisplayController.searchResultsTableView) { return 1; } else { return ziMuArr.count; } } //section 的名字 -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { if (tableView == searchDisplayController.searchResultsTableView) { return nil; } else { return [ziMuArr objectAtIndex:section]; } } - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView { if (tableView == searchDisplayController.searchResultsTableView) { return nil; } else { return ziMuArr; } }