模仿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;
}
}

