给TableView增加SearchBar

效果如图:


可以根据输入的关键字,在TableView中显示符合的数据。
图中分组显示和索引效果,前面的博文已经记录,不再赘述。下面的例子是基于前文的基础上修改的,所以文件名啥的,请参考前文。
第一步是在TableView上方添加一个Search Bar,这里有一点需要注意,必须先把TableView拖下来,留下空间放Search Bar,不要在Table View占满屏幕的情况下把Search Bar拖到Table View顶部。区别在于,使用后面的方法,Search Bar是作为Table View的Header部分添加的,而前面的方法,Search Bar是独立的。在添加索引功能时,如果作为Table View的Header添加,右侧的索引会遮住Search Bar的右边部分。Search Bar几个常用属性:
Placeholder是提示,就是hint属性,Corretion是自动修正,一般设为NO,即不修正,Show Cancel Button是显示取消按钮,我这里勾选。选中Search Bar的情况下切换到Connections Inspector面板,delegate与File’s Owner建立连接(我们会在ViewController中支持UISearchBarDelegate协议)。与前面几篇文章的例子相 同,ViewController文件名为PDViewController.h和PDViewController.m。
第二步,添加Table View和Search Bar的Outlet.按住Control键,分别拖动Table View和Search Bar到PDViewController.h,添加Outlet
第三步,就是PDViewController代码:
PDViewController.h:


#import <UIKit/UIKit.h>
 
@interface PDViewController : UIViewController<UITableViewDelegate,UITableViewDataSource,UISearchBarDelegate>
@property (strong,nonatomic) NSDictionary *names;
@property (strong,nonatomic) NSMutableDictionary *mutableNames;
@property (strong,nonatomic)NSMutableArray *mutableKeys;
//可变字典和可变数组,用于存储显示的数据,而不可变的字典用于存储从文件中读取的数据
@property (strong, nonatomic) IBOutlet UITableView *table;
@property (strong, nonatomic) IBOutlet UISearchBar *search;
-(void)resetSearch;
//重置搜索,即恢复到没有输入关键字的状态
-(void)handleSearchForTerm:(NSString *)searchTerm;
//处理搜索,即把不包含searchTerm的值从可变数组中删除
 
@end



#import "PDViewController.h"
#import "NSDictionary+MutableDeepCopy.h"
 
@implementation PDViewController
@synthesize names=_names;
@synthesize mutableKeys=_mutableKeys;
@synthesize table = _table;
@synthesize search = _search;
@synthesize mutableNames=_mutableNames;
- (void)didReceiveMemoryWarning
{
       [super didReceiveMemoryWarning];
       // Release any cached data, images, etc that aren't in use.
}
 
#pragma mark - View lifecycle
 
- (void)viewDidLoad
{
       [super viewDidLoad];
       // Do any additional setup after loading the view, typically from a nib.
       NSString *path=[[NSBundle mainBundle] pathForResource:@"sortednames" ofType:@"plist"];
       //取得sortednames.plist绝对路径
       //sortednames.plist本身是一个NSDictionary,以键-值的形式存储字符串数组
 
       NSDictionary *dict=[[NSDictionary alloc] initWithContentsOfFile:path];
       //转换成NSDictionary对象
       self.names=dict;
 
       [self resetSearch];
       //重置
       [_table reloadData];
       //重新载入数据
 
}
 
- (void)viewDidUnload
{
       [self setTable:nil];
       [self setSearch:nil];
       [super viewDidUnload];
       self.names=nil;
       self.mutableKeys=nil;
       self.mutableNames=nil;
       // Release any retained subviews of the main view.
       // e.g. self.myOutlet = nil;
}
 
- (BOOL)shouldAutorotateToInterf aceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
       // Return YES for supported orientations
       return (interfaceOrientation != UIInterfaceOrientationPo rtraitUpsideDown);
}
-(NSInteger)numberOfSectionsInTableV iew:(UITableView *)tableView
{
       //返回分组数量,即Array的数量
       return [_mutableKeys count];
       //
 
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
 
       if ([_mutableKeys count]==0) {
               return 0;
       }
       NSString *key=[_mutableKeys objectAtIndex:section];
       NSArray *nameSection=[_mutableNames objectForKey:key];
       return [nameSection count];
       //返回Array的大小
 
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
 
       NSUInteger section=[indexPath section];
       //分组号
       NSUInteger rowNumber=[indexPath row];
       //行号
       //即返回第section组,rowNumber行的UITableViewCell
 
       NSString *key=[_mutableKeys objectAtIndex:section];
       //取得第section组array的key
       NSArray *nameSection=[_mutableNames objectForKey:key];
       //通过key,取得Array
 
       static NSString * tableIdentifier=@"CellFromNib";
 
       UITableViewCell *cell=[tableView dequeueReusableCellWithI dentifier:tableIdentifier];
       if(cell==nil)
       {
               cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefa ult reuseIdentifier:tableIdentifier];
 
       }
       cell.textLabel.text=[nameSection objectAtIndex:rowNumber];
       //从数组中读取字符串,设置text
       return cell;
}
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
       if ([_mutableKeys count]==0) {
               return 0;
       }
       NSString *key=[_mutableKeys objectAtIndex:section];
       return key;
}
-(NSArray *)sectionIndexTitlesForTab leView:(UITableView *)tableView
{
       return _mutableKeys;
       //通过key来索引
}
-(void)resetSearch
{//重置搜索
       _mutableNames=[_names mutableDeepCopy];
       //使用mutableDeepCopy方法深复制
       NSMutableArray *keyarr=[NSMutableArray new];
       [keyarr addObjectsFromArray:[[_names allKeys] sortedArrayUsingSelector :@selector(compare:)]];
       //读取键,排序后存放可变数组
       _mutableKeys=keyarr;
 
}
-(void)handleSearchForTerm:(NSString *)searchTerm
{//处理搜索
       NSMutableArray *sectionToRemove=[NSMutableArray new];
       //分组待删除列表
       [self resetSearch];
       //先重置
       for(NSString *key in _mutableKeys)
       {//循环读取所有的数组
               NSMutableArray *array=[_mutableNames valueForKey:key];
               NSMutableArray *toRemove=[NSMutableArray new];
               //待删除列表
               for(NSString *name in array)
               {//数组内的元素循环对比
                       if([name rangeOfString:searchTerm options:NSCaseInsensitiveSearch].location==NSNotFound)
                       {
                               //rangeOfString方法是返回NSRange对象(包含位置索引和长度信息)
                               //NSCaseInsensitiveSearch是忽略大小写
                               //这里的代码会在name中找不到searchTerm时执行
                               [toRemove addObject:name];
                               //找不到,把name添加到待删除列表
                       }
               }
               if ([array count]==[toRemove count]) {
                       [sectionToRemove addObject:key];
               //如果待删除的总数和数组元素总数相同,把该分组的key加入待删除列表,即不显示该分组
               }
               [array removeObjectsInArray:toRemove];
               //删除数组待删除元素
       }
       [_mutableKeys removeObjectsInArray:sectionToRemove];
       //能过待删除的key数组删除数组
       [_table reloadData];
       //重载数据
 
}
-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath :(NSIndexPath *)indexPath
{//TableView的项被选择前触发
       [_search resignFirstResponder];
       //搜索条释放焦点,隐藏软键盘
       return indexPath;
}
-(void)searchBarSearchButtonCli cked:(UISearchBar *)searchBar
{//按软键盘右下角的搜索按钮时触发
       NSString *searchTerm=[searchBar text];
       //读取被输入的关键字
       [self handleSearchForTerm:searchTerm];
       //根据关键字,进行处理
       [_search resignFirstResponder];
       //隐藏软键盘
 
}
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{//搜索条输入文字修改时触发
       if([searchText length]==0)
       {//如果无文字输入
               [self resetSearch];
               [_table reloadData];
               return;
       }
 
       [self handleSearchForTerm:searchText];
       //有文字输入就把关键字传给handleSearchForTerm处理
}
-(void)searchBarCancelButtonCli cked:(UISearchBar *)searchBar
{//取消按钮被按下时触发
       [self resetSearch];
       //重置
       searchBar.text=@"";
       //输入框清空
       [_table reloadData];
       [_search resignFirstResponder];
       //重新载入数据,隐藏软键盘
 
}
@end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值