模仿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;}}
最後就實現了: