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、运行效果图

    • -------
  • 相关阅读:
    自用python时间格式转换lib库代码
    如何在datetime.strptime中添加时区
    bs3迁移到bs4, import lxml.html.soupparser 报错的解决
    mac下pip install lxml报错
    删除 Mac OS 10.10 中“打开方式”里重复或无用的程序列表
    python的urllib2库详细使用说明
    近期个人项目计划
    在centos中添加freeswitch服务开机自动运行
    ddd
    Sqlserver 2008安装
  • 原文地址:https://www.cnblogs.com/CH520/p/9420419.html
Copyright © 2011-2022 走看看