• iOS


    前言

    	NS_CLASS_DEPRECATED_IOS(3_0, 8_0, "UISearchDisplayController has been replaced with UISearchController")
    	@interface UISearchDisplayController : NSObject
    	
    	@available(iOS, introduced=3.0, deprecated=8.0, message="UISearchDisplayController has been replaced with 
    		UISearchController")
    	public class UISearchDisplayController : NSObject
    
    
    	NS_CLASS_AVAILABLE_IOS(8_0) @interface UISearchController : UIViewController 
    		<UIViewControllerTransitioningDelegate, UIViewControllerAnimatedTransitioning>
    	@available(iOS 8.0, *) 	 public class UISearchController : UIViewController, 
    		UIViewControllerTransitioningDelegate, UIViewControllerAnimatedTransitioning
    
    • 在 iOS 8.0 以上版本中, 我们可以使用 UISearchController 来非常方便地在 UITableView 中添加搜索框. 而在之前版本中, 我们还是必须使用 UISearchDisplayController + UISearchBar 的组合方式.

    • 我们创建的 tableView 和搜索控制器创建的 tableView 都会走代理方法,需要在代理方法中判断响应代理方法的 tableView 是哪一个,如果响应代理方法的 tableView 不是我创建的,说明一定是搜索控制器创建的。在 iOS 8.0 以下版本中需使用 tableView == myTableView 判断,在 iOS 8.0 以上版本中需使用 mySearchController.active 判断。

    1、搜索框的创建

    1.1 在 iOS 8.0 以下版本中

    • Objective-C

      • 遵守协议 UISearchDisplayDelegate

      • 搜索结果数组初始化

        	// 声明搜索结果存放数组
        	@property(nonatomic, retain)NSMutableArray *mySearchResultArray;
        
        	// 初始化搜索结果存放数组
        	mySearchResultArray = [[NSMutableArray alloc] init];
        
      • 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;
        
      • 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;
        	}
        
      • 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;
        	}
        
    • Swift

      • 遵守协议 UISearchDisplayDelegate

      • 搜索结果数组初始化

        	// 初始化搜索结果存放数组
        	var mySearchResultArray:[String] = Array()
        
      • searchDisplayController 初始化

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

        	// 更新搜索结果
        	/*
        		只要搜索框的文字发生了改变,这个方法就会触发。searchString 为搜索框内输入的内容
        	*/
        	func searchDisplayController(controller: UISearchDisplayController, shouldReloadTableForSearchString searchString: String?) -> Bool {
        	
        		// 清空上一次搜索的内容
        		mySearchResultArray.removeAll()
        
        		// 将搜索的结果存放到数组中
        		for subArray in myDataArray {
        			for str in subArray {
            
        				let range:NSRange = (str as NSString).rangeOfString(searchString!)
            
        				if range.length != 0 {
        					mySearchResultArray.append(str)
        				}
        			}
        		}
        
        		return true
        	}
        
      • UITableView 协议方法

        	// 设置分段头标题
        	func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
            
            	if tableView == myTableView {
            		return "(Character(UnicodeScalar(65 + section)))"
            	}
            	return "搜索结果"
        	}
        
        	// 设置分段数
        	func numberOfSectionsInTableView(tableView: UITableView) -> Int {
            
            	if tableView == myTableView {
        			return myDataArray.count
            	}
            	return 1
        	}
        
        	// 设置行数
        	func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            
        		if tableView == myTableView {
                
        			return myDataArray[section].count
        		}
        		return mySearchResultArray.count
        	}
        
        	// 设置每段显示的内容
        	func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
            
            	var cell = tableView.dequeueReusableCellWithIdentifier("testIdentifier")
            
            	if cell == nil {
            		cell = UITableViewCell(style: .Default, reuseIdentifier: "testIdentifier")
            	}
            
            	if tableView == myTableView {
        			cell!.textLabel?.text = myDataArray[indexPath.section][indexPath.row]
            	}
            	else {
            		cell!.textLabel?.text = mySearchResultArray[indexPath.row]
            	}
            
            	return cell!
        	}
        

    1.2 在 iOS 8.0 及以上版本中

    • Objective-C

      • 遵守协议 UISearchResultsUpdating

      • 搜索结果数组初始化

        	// 声明搜索结果存放数组
        	@property(nonatomic, retain)NSMutableArray *mySearchResultArray;
        
        	// 初始化搜索结果存放数组
        	mySearchResultArray = [[NSMutableArray alloc] init];
        
      • 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;
        
      • 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];
        	}
        
      • 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;
        	}
        
    • Swift

      • 遵守协议 UISearchResultsUpdating

      • 搜索结果数组初始化

        	// 初始化搜索结果存放数组
        	var searchResultArray:[String] = Array()
        
      • searchController 初始化

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

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

        	// 设置分段头标题
        	func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
            
        		if mySearchController.active {
        			return "搜索结果"
        		}
        		return "(Character(UnicodeScalar(65 + section)))"
        	}
        
        	// 设置分段数
        	func numberOfSectionsInTableView(tableView: UITableView) -> Int {
            
        		if mySearchController.active {
                
        			return 1
        		}
        		return myDataArray.count
        	}
        
        	// 设置行数
        	func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            
        		if mySearchController.active {
                
        			return searchResultArray.count
        		}
        		return myDataArray[section].count
        	}
        
        	// 设置每段显示的内容
        	func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {       		
            
        		var cell = tableView.dequeueReusableCellWithIdentifier("testIdentifier")
            
        		if cell == nil {
        			cell = UITableViewCell(style: .Default, reuseIdentifier: "testIdentifier")
        		}
            
        		if mySearchController.active {
        			cell!.textLabel?.text = searchResultArray[indexPath.row]
        		}
        		else {
        			cell!.textLabel?.text = myDataArray[indexPath.section][indexPath.row]
        		}
            
        		return cell!
        	}
        
  • 相关阅读:
    细说 ASP.NET Cache 及其高级用法【转】
    类变量和实例变量的区别是什么?
    【转】细说Cookie
    【转】细说 Form (表单)
    PHP API中,MYSQL与MYSQLI的持久连接区别
    Extending_and_embedding_php翻译
    linux常见面试题及答案
    手机辐射查询
    php5.3 PHP5.4 PHP5.5 新特性/使用PHP5.5要注意的
    sqoop安装遇到的问题
  • 原文地址:https://www.cnblogs.com/QianChia/p/5758927.html
Copyright © 2020-2023  润新知