/*
UITableView的搜索功能
1.设置索引
索引方法,要求索引元素的个数与分区的个数一致 (NSArray *)sectionIndexTitlesForTableView
哪个索引不能点击,-(NSInteger)tableview: sectionForSectionIndexTitle
2.在UITableView头上放搜索框
3.UISearchDisplayController
4.显示搜索结果
*/
-------------------------------------------------------------------------------------------------------------
//
// MyTableViewController.h
// UITableView-2-SearchOld
//
// Created by qianfeng on 15/9/28.
// Copyright (c) 2015年 qianfeng. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface MyTableViewController : UITableViewController<UISearchResultsUpdating,UISearchBarDelegate>
@end
-------------------------------------------------------------------------------------------------------------
//
// MyTableViewController.m
// UITableView-2-SearchOld
//
// Created by qianfeng on 15/9/28.
// Copyright (c) 2015年 qianfeng. All rights reserved.
//
#import "MyTableViewController.h"
#import "SearchResultTableViewController.h"
@interface MyTableViewController ()
//数据源
@property (nonatomic) NSMutableArray *dataArr;
//搜索控制器
@property (nonatomic)UISearchController *scc;
//搜索结果
@property (nonatomic) NSMutableArray *searchResult;
@property (nonatomic) NSMutableArray *sectionHeadArr;
@end
@implementation MyTableViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self customNaviItem];
[self createDataSource];
[self createSearchBar];
}
#pragma mark - 定制导航Item
- (void)customNaviItem
{
//设置标题
self.navigationItem.title = @"联系人";
}
#pragma mark - 创建数据源
- (void)createDataSource
{
self.dataArr = [[NSMutableArray alloc]init];
for (int i = ‘A‘; i<=‘Z‘; i++) {
NSMutableArray *arr = [[NSMutableArray alloc] init];
for (int j = 0 ; j<10; j++) {
NSString * str = [NSString stringWithFormat:@"%c%c%c%c",i, arc4random()%26+‘A‘, arc4random()%26+‘A‘, arc4random()%26+‘A‘];
[arr addObject:str];
}
[self.dataArr addObject:arr];
}
//段头的数据
self.sectionHeadArr = [[NSMutableArray alloc]init];
for (int k = ‘A‘; k<=‘Z‘; k++) {
NSString *str = [NSString stringWithFormat:@"%c",k];
[self.sectionHeadArr addObject:str];
}
}
#pragma mark - 创建搜索栏
- (void)createSearchBar
{
//创建SearchResultTableViewController视图控制器
SearchResultTableViewController * srtvc = [[SearchResultTableViewController alloc] init];
//—scc是搜索控制器
_scc = [[UISearchController alloc] initWithSearchResultsController:srtvc];
// [sc.searchBar sizeToFit];
_scc.searchBar.frame = CGRectMake(0, 0, self.view.frame.size.width, 40);
//设置表头为searchBar,下一个界面的searchBar
self.tableView.tableHeaderView = _scc.searchBar;
//设置大写
_scc.searchBar.autocapitalizationType = UITextAutocapitalizationTypeAllCharacters;
//设置代理
_scc.searchResultsUpdater = self;
_scc.searchBar.delegate = self;
self.definesPresentationContext = YES;
_scc.active = YES;
}
#pragma mark - 搜索结果更新协议
- (void)updateSearchResultsForSearchController:(UISearchController *)searchController
{
if (self.searchResult == nil) {
self.searchResult = [[NSMutableArray alloc]init];
}else{
//清除上一次的搜索结果
[self.searchResult removeAllObjects];
}
for (NSArray *arr in self.dataArr) {
for (NSString *name in arr) {
//AABB A
NSRange range = [name rangeOfString:searchController.searchBar.text];
if (range.location != NSNotFound) {
[self.searchResult addObject:name];
}
}
}
SearchResultTableViewController *svc = (id)searchController.searchResultsController;
svc.resultArr = self.searchResult;
//刷新数据
[svc.tableView reloadData];
}
#pragma mark - Table view data source
//------------------------------------------------------
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return self.dataArr.count;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [self.dataArr[section] count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell2" ];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell2"];
}
if (self.tableView == tableView) {
cell.textLabel.text = self.dataArr[indexPath.section][indexPath.row];
}
return cell;
}
//------------------------------------------------------
#pragma mark ------------------------段头段尾设置
//------------------------------------------------------
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
return self.sectionHeadArr[section];
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return 30;
}
//------------------------------------------------------
#pragma mark ------------------------索引
- (NSArray*)sectionIndexTitlesForTableView:(UITableView *)tableView
{
//注 索引和段保持一致
return self.sectionHeadArr;
}
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
{
if (index == 2) {
return -1;
}
return index;
}
@end
-------------------------------------------------------------------------------------------------------------
//
// SearchResultTableViewController.h
// UITableView-2-SearchNew
//
// Created by qianfeng on 15/9/28.
// Copyright (c) 2015年 qianfeng. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface SearchResultTableViewController : UITableViewController
@property (nonatomic) NSMutableArray *resultArr;
@end
-------------------------------------------------------------------------------------------------------------
#import "SearchResultTableViewController.h"
@interface SearchResultTableViewController ()
@end
@implementation SearchResultTableViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor orangeColor];
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.resultArr.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell3"];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell3"];
}
cell.textLabel.text = self.resultArr[indexPath.row];
return cell;
}
@end
-------------------------------------------------------------------------------------------------------------
在MyTableViewController(一)创建数据源,导航栏,段头段尾等。
在SearchResultTableViewController(二)正常创建显示三个方法
主要在一中创建数据源和搜索栏还有更新协议
#pragma mark - 创建搜索栏
- (void)createSearchBar
{
//创建SearchResultTableViewController视图控制器
SearchResultTableViewController * srtvc = [[SearchResultTableViewController alloc] init];//初始化一个二
//—scc是搜索控制器
_scc = [[UISearchController alloc] initWithSearchResultsController:srtvc];//搜索控制器用一个srtvc来初始化
// [sc.searchBar sizeToFit];
_scc.searchBar.frame = CGRectMake(0, 0, self.view.frame.size.width, 40);//设置frame
//设置表头为searchBar,下一个界面的searchBar
self.tableView.tableHeaderView = _scc.searchBar;//把搜索控制器对象放在表头
//设置大写
_scc.searchBar.autocapitalizationType = UITextAutocapitalizationTypeAllCharacters;
//设置代理
_scc.searchResultsUpdater = self;
_scc.searchBar.delegate = self;
self.definesPresentationContext = YES;
_scc.active = YES;
}
#pragma mark - 搜索结果更新协议
- (void)updateSearchResultsForSearchController:(UISearchController *)searchController
{
if (self.searchResult == nil) {
self.searchResult = [[NSMutableArray alloc]init];
}else{
//清除上一次的搜索结果
[self.searchResult removeAllObjects];
}
for (NSArray *arr in self.dataArr) {
for (NSString *name in arr) {
//AABB A
//searchController.searchBar.text就是在搜索栏中的输入,比较name根它有没有一样的,加入self.searchResult中
NSRange range = [name rangeOfString:searchController.searchBar.text];
if (range.location != NSNotFound) {
[self.searchResult addObject:name];
}
}
}
//取得第二个里边的SearchResultTableViewController,刷新显示
SearchResultTableViewController *svc = (id)searchController.searchResultsController;
svc.resultArr = self.searchResult;
//刷新数据
[svc.tableView reloadData];
}
上边的橘色就是在第二个页面中的,不是第一个页面