zoukankan      html  css  js  c++  java
  • 搜索框的创建

    • 在 iOS 8.0 以上版本中, 我们可以使用 UISearchController 来非常方便地在 UITableView 中添加搜索框.
    • 而在之前版本中, 我们还是必须使用 UISearchDisplayController + UISearchBar 的组合方式。
    • 我们创建的 tableView 和搜索控制器创建的 tableView 都会走代理方法,
    • 需要在代理方法中判断响应代理方法的 tableView 是哪一个,如果响应代理方法的 tableView 不是我创建的,
    • 说明一定是搜索控制器创建的。在 iOS 8.0 以下版本中需使用 tableView == myTableView 判断,
    • 在 iOS 8.0 以上版本中需使用 mySearchController.active 判断。

    1、在 iOS 8.0 以下版本中

    • 遵守协议 UISearchDisplayDelegate
    • 1.1 搜索结果数组初始化

    // 声明搜索结果存放数组
    @property(nonatomic, retain)NSMutableArray *mySearchResultArray;
    
    // 初始化搜索结果存放数组
    mySearchResultArray = [[NSMutableArray alloc] init];
    
    • 1.2 searchDisplayController 初始化

    // 声明搜索控制器,自带一个表格视图,用来展示搜索结果,必须设置为全局变量
    @property(nonatomic, retain)UISearchDisplayController *mySearchDisplayController;
    
    // 实例化搜索条
    UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 44)];
    
    // 实例化搜索控制器对象
    mySearchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
    
    // 设置搜索控制器的代理
    mySearchDisplayController.delegate = self;
    
    // 为搜索控制器自带 tableView 指定代理
    mySearchDisplayController.searchResultsDelegate = self;
    mySearchDisplayController.searchResultsDataSource = self;
    
    // 将搜索条设置为 tableView 的表头
    myTableView.tableHeaderView = searchBar;
    
    • 1.3 UISearchDisplayDelegate 协议方法

    // 更新搜索结果
    /*
    只要搜索框的文字发生了改变,这个方法就会触发。searchString 为搜索框内输入的内容。
    */
    - (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
    
    	// 清空上一次搜索的内容
    	[mySearchResultArray removeAllObjects];
    
    	for (NSArray *subArray in myDataArray) {
    
    		// 将搜索的结果存放到数组中
    		for (NSString *str in subArray) {
    			NSRange range = [str rangeOfString:searchString];
    			if (range.length) {
    				[mySearchResultArray addObject:str];
    			}
    		}
    	}
    	return YES;
    }
    
    • 1.4 UITableView 协议方法

    // 设置分段头标题
    - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    
    	if (tableView == myTableView) {
    		return [NSString stringWithFormat:@"%c", (char)('A' + section)];
    	}
    	return @"搜索结果";
    }
    
    // 设置分段数
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    
    	if (tableView == myTableView) {
    		return myDataArray.count;
    	}
    	return 1;
    }
    
    // 设置行数
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    
    	if (tableView == myTableView) {
    		return [[myDataArray objectAtIndex:section] count];
    	}
    	return mySearchResultArray.count;
    }
    
    // 设置每段显示的内容
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    	UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"testIdentifier"];
    
    	if (!cell) {
    		cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"testIdentifier"];
    	}
    
    	if (tableView == myTableView) {
    		cell.textLabel.text = [[myDataArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
    	}
    	else {
    		cell.textLabel.text = [mySearchResultArray objectAtIndex:indexPath.row];
    	}
    	return cell;
    }
    

    2、在 iOS 8.0 及以上版本中

    • 遵守协议 UISearchResultsUpdating
    • 2.1 搜索结果数组初始化

    // 声明搜索结果存放数组
    @property(nonatomic, retain)NSMutableArray *mySearchResultArray;
    
    // 初始化搜索结果存放数组
    mySearchResultArray = [[NSMutableArray alloc] init];
    
    • 2.2 searchController 初始化

    // 声明搜索控制器,自带一个表格视图控制器,用来展示搜索结果,必须设置为全局变量
    @property(nonatomic, retain)UISearchController *mySearchController;
    
    // 实例化搜索控制器
    mySearchController = [[UISearchController alloc] initWithSearchResultsController:nil];
    
    // 设置搜索代理
    mySearchController.searchResultsUpdater = self;
    
    // 设置搜索条大小
    [mySearchController.searchBar sizeToFit];
    
    // 设置搜索期间背景视图是否取消操作,default is YES
    mySearchController.dimsBackgroundDuringPresentation = NO;
    
    // 设置搜索期间是否隐藏导航条,default is YES
    mySearchController.hidesNavigationBarDuringPresentation = NO;
    
    // 将 searchBar 添加到表格的开头
    myTableView.tableHeaderView = mySearchController.searchBar;
    
    • 2.3 UISearchResultsUpdating 协议方法

    // 更新搜索结果
    /*
    只要搜索框的文字发生了改变,这个方法就会触发。searchController.searchBar.text 为搜索框内输入的内容
    */
    - (void)updateSearchResultsForSearchController:(UISearchController *)searchController {
    
    	// 清除上一次的搜索结果
    	[mySearchResultArray removeAllObjects];
    
    	// 将搜索的结果存放到数组中
    	for (NSArray *subArray in myDataArray) {                                                                            
    		for (NSString *str in subArray) {
    
    			NSRange range = [str rangeOfString:searchController.searchBar.text];
    			if (range.length) {
    				[mySearchResultArray addObject:str];
    			}
    		}
    	}
    
    	// 重新加载表格视图,不加载的话将不会显示搜索结果
    	[myTableView reloadData];
    }
    
    • 2.4 UITableView 协议方法

    // 设置分段头标题
    - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {                           
    
    	if (mySearchController.active) {
    		return @"搜索结果";
    	}
    	return [NSString stringWithFormat:@"%c", (char)('A' + section)];
    }
    
    // 设置分段数
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    
    	if (mySearchController.active) {
    		return 1;
    	}
    	return myDataArray.count;
    }
    
    // 设置行数
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    
    	if (mySearchController.active) {
    		return mySearchResultArray.count;
    	}
    	return [[myDataArray objectAtIndex:section] count];
    }
    
    // 设置每段显示的内容
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {                
    
    	UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"testIdentifier"];
    
    	if (!cell) {
    		cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"testIdentifier"];
    	}
    
    	if (mySearchController.active) {
    		cell.textLabel.text = [mySearchResultArray objectAtIndex:indexPath.row];
    	}
    	else {
    		cell.textLabel.text = [[myDataArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
    	}
    	return cell;
    }
    

    3、运行效果图

    • -------
  • 相关阅读:
    109 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 03 新增功能及实现 05 问题解析--通过一个方法完成学生和专业的双向关联
    108 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 03 新增功能及实现 04 问题解析--数组未实例化造成的空指针异常
    107 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 03 新增功能及实现 03 编写方法完成学生个数统计功能
    106 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 03 新增功能及实现 02 新增属性完成学生信息存储
    105 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 03 新增功能及实现 01 新增需求及分析
    session与cookie的区别和联系
    session和cookie的区别
    Web服务器主动推送技术
    webSocket的场景应用
    TCP、Http和Socket 优劣比较
  • 原文地址:https://www.cnblogs.com/CH520/p/9420419.html
Copyright © 2011-2022 走看看