UISearchBar和UISearchDisplayController



原文 http://hi.baidu.com/happywilma0118/item/e6d5730a499bba1b3a53eef8

 

UISearchBar继承自UIView、UIResponder、NSObject

 

  属性:

 autocapitalizationType————自动对输入文本对象进行大小写设置(包含4种类型,但是有时候键盘会屏蔽此属性)

 autocorrectionType————自动对输入文本对象进行纠错。

 backgroundImage————searchbar的背景图片,如果图片不是可伸缩的或者1点宽,则一般被平铺

 barStyle————控件的样式

 delegate————控件的委托,委托要遵从UISearchBarDelegate协议,默认是nil

 keyboardType————输入时,键盘的样式

 placeholder————半透明的提示文字,输入搜索内容消失

 prompt————显示在控件顶部的一行提示文字

 text————控件上面的显示的文字
 showsBookmarkButton————是否在控件的右端显示一个书的按钮(输入文字时消失)
 showsCancelButton————是否显示cancel按钮(默认是显示)
 showsSearchResultsButton————是否在控件的右端显示搜索结果按钮
 searchResultsButtonSelected————搜索结果按钮是否被选中
 tintColor————bar的颜色(具有渐变效果)
 translucent————指定控件是否会有透视效果
 scopeButtonTitles————搜索栏下部的选择栏,数组里面的内容是按钮的标题
 selectedScopeButtonIndex————搜索栏下部的选择栏按钮的个数
 showsScopeBar————控制搜索栏下部的选择栏是否显示出来(需设置为YES 才能使用scopebar)

 

UISearchBar不执行搜索行为,必须使用delegate,当输入搜索文本、点击button按钮后,代理的方法会完成搜索对应的操作。

 

1.编辑输入事件:

2.点击按钮事件:

3.Scope按钮事件:

 

利用UISearchBar的委托事件 textDidChange, 当在搜索框中输入完成后,如果输入的文本长度>0,可以调用自己的搜索方法,得到搜索结果,然后再reloadData,刷新一下。如果输入文本长 度<0,则需要恢复到原始数据。这个方法可以在边输入搜索文本边显示结果。 如果需要按“search”按钮再搜索,则将上述操作放在searchBarSearchButtonClicked中。

 

利用UISearchDisplayController可以简化很多操作,也能达到搜索的目的。

属性:

active————是搜索界面可视化,默认为no,可用setActive方法设置.

delegate————委托

searchBar————在searchdisplaycontroller初始化后,searchbar是不可修改的,是readonly属性的.

searchContentController————管理搜索内容的试图控制器,一般是一个UITableViewController的实例,意思是针对一个UITableView的内容进行搜索

searchResultsDataSource————搜索结果的数据源

searchResultsDelegate————搜索结果的委托

searchResultsTableView————搜索结果要展示在哪个tableview中(read-only);

searchResultsTitle————搜索结果视图的title

 

初始化一个searchDisplayController:

 

        UISearchBar * theSearchBar = [[[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width-50, 40)] autorelease];

        theSearchBar.placeholder = @"enter province name";

        theSearchBar.autocorrectionType = UITextAutocorrectionTypeNo;

        theSearchBar.autocapitalizationType = UITextAutocapitalizationTypeAllCharacters;  

        theSearchBar.scopeButtonTitles = [NSArray arrayWithObjects:@"All",@"A",@"B",@"C",@"D" ,nil];

        theSearchBar.showsScopeBar = YES;

        theSearchBar.keyboardType = UIKeyboardTypeNamePhonePad;

        theSearchBar.showsBookmarkButton = YES;

        

        tableView.tableHeaderView = theSearchBar;  //将searchBar添加到tableView的头,注意滚动出屏幕后,搜索框也不在了,只出现在首页

        

      UISearchDisplayController * searchdispalyCtrl = [[UISearchDisplayController  alloc] initWithSearchBar:theSearchBar contentsController:self];

        searchdispalyCtrl.active = NO;

        searchdispalyCtrl.delegate = self;

        searchdispalyCtrl.searchResultsDelegate=self;

        searchdispalyCtrl.searchResultsDataSource = self;

 

使用UISearchDisplayDelegate的委托方法进行搜索操作:

1.搜索状态改变:

2.装载和卸载tableview:

3.显示和隐藏tableview:

4.搜索条件改变时响应:

 

searchDisplayController 自身有一个searchResultsTableView,所以在执行操作的时候首先要判断是否是搜索结果的tableView,如果是显示的就是搜索结 果的数据,如果不是,是TableView自身的view,则需要显示原始数据。

  if(tableView == self.searchDisplayController.searchResultsTableView)

    {

        arr = [self.filterContent valueForKey:key]; //搜索结果

    }

    else 

    {

        arr = [self.localresource valueForKey:key];  //原始数据

    }

 

这样就不需要每次都realoadData了。

原文 http://hi.baidu.com/happywilma0118/item/e6d5730a499bba1b3a53eef8

 

UISearchBar继承自UIView、UIResponder、NSObject

 

  属性:

 autocapitalizationType————自动对输入文本对象进行大小写设置(包含4种类型,但是有时候键盘会屏蔽此属性)

 autocorrectionType————自动对输入文本对象进行纠错。

 backgroundImage————searchbar的背景图片,如果图片不是可伸缩的或者1点宽,则一般被平铺

 barStyle————控件的样式

 delegate————控件的委托,委托要遵从UISearchBarDelegate协议,默认是nil

 keyboardType————输入时,键盘的样式

 placeholder————半透明的提示文字,输入搜索内容消失

 prompt————显示在控件顶部的一行提示文字

 text————控件上面的显示的文字
 showsBookmarkButton————是否在控件的右端显示一个书的按钮(输入文字时消失)
 showsCancelButton————是否显示cancel按钮(默认是显示)
 showsSearchResultsButton————是否在控件的右端显示搜索结果按钮
 searchResultsButtonSelected————搜索结果按钮是否被选中
 tintColor————bar的颜色(具有渐变效果)
 translucent————指定控件是否会有透视效果
 scopeButtonTitles————搜索栏下部的选择栏,数组里面的内容是按钮的标题
 selectedScopeButtonIndex————搜索栏下部的选择栏按钮的个数
 showsScopeBar————控制搜索栏下部的选择栏是否显示出来(需设置为YES 才能使用scopebar)

 

UISearchBar不执行搜索行为,必须使用delegate,当输入搜索文本、点击button按钮后,代理的方法会完成搜索对应的操作。

 

1.编辑输入事件:

2.点击按钮事件:

3.Scope按钮事件:

 

利用UISearchBar的委托事件 textDidChange, 当在搜索框中输入完成后,如果输入的文本长度>0,可以调用自己的搜索方法,得到搜索结果,然后再reloadData,刷新一下。如果输入文本长 度<0,则需要恢复到原始数据。这个方法可以在边输入搜索文本边显示结果。 如果需要按“search”按钮再搜索,则将上述操作放在searchBarSearchButtonClicked中。

 

利用UISearchDisplayController可以简化很多操作,也能达到搜索的目的。

属性:

active————是搜索界面可视化,默认为no,可用setActive方法设置.

delegate————委托

searchBar————在searchdisplaycontroller初始化后,searchbar是不可修改的,是readonly属性的.

searchContentController————管理搜索内容的试图控制器,一般是一个UITableViewController的实例,意思是针对一个UITableView的内容进行搜索

searchResultsDataSource————搜索结果的数据源

searchResultsDelegate————搜索结果的委托

searchResultsTableView————搜索结果要展示在哪个tableview中(read-only);

searchResultsTitle————搜索结果视图的title

 

初始化一个searchDisplayController:

 

        UISearchBar * theSearchBar = [[[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width-50, 40)] autorelease];

        theSearchBar.placeholder = @"enter province name";

        theSearchBar.autocorrectionType = UITextAutocorrectionTypeNo;

        theSearchBar.autocapitalizationType = UITextAutocapitalizationTypeAllCharacters;  

        theSearchBar.scopeButtonTitles = [NSArray arrayWithObjects:@"All",@"A",@"B",@"C",@"D" ,nil];

        theSearchBar.showsScopeBar = YES;

        theSearchBar.keyboardType = UIKeyboardTypeNamePhonePad;

        theSearchBar.showsBookmarkButton = YES;

        

        tableView.tableHeaderView = theSearchBar;  //将searchBar添加到tableView的头,注意滚动出屏幕后,搜索框也不在了,只出现在首页

        

      UISearchDisplayController * searchdispalyCtrl = [[UISearchDisplayController  alloc] initWithSearchBar:theSearchBar contentsController:self];

        searchdispalyCtrl.active = NO;

        searchdispalyCtrl.delegate = self;

        searchdispalyCtrl.searchResultsDelegate=self;

        searchdispalyCtrl.searchResultsDataSource = self;

 

使用UISearchDisplayDelegate的委托方法进行搜索操作:

1.搜索状态改变:

2.装载和卸载tableview:

3.显示和隐藏tableview:

4.搜索条件改变时响应:

 

searchDisplayController 自身有一个searchResultsTableView,所以在执行操作的时候首先要判断是否是搜索结果的tableView,如果是显示的就是搜索结 果的数据,如果不是,是TableView自身的view,则需要显示原始数据。

  if(tableView == self.searchDisplayController.searchResultsTableView)

    {

        arr = [self.filterContent valueForKey:key]; //搜索结果

    }

    else 

    {

        arr = [self.localresource valueForKey:key];  //原始数据

    }

 

这样就不需要每次都realoadData了。



NSArray *dataList;

NSMutableArray *showData

定义2个数组,showData用来搜索存放显示的数据,dataList用来存放原始数据.

 

2.实现以下几个代理方法

//搜索结果的行数

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

{

   return [_showData count]>0?[_showData count]:0;

}

 //配置单元格

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

 static NSString *TableSampleIdentifier = @"TableSampleIdentifier";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:TableSampleIdentifier];

  if (cell == nil) {

//不存在就创建 

 cell = [[UITableViewCell alloc]

initWithStyle:UITableViewCellStyleDefault reuseIdentifier:TableSampleIdentifier];

 } if (_showData != nil && _showData.count >0) {

//如果搜索结果存在

  cell.textLabel.text = [_showData objectAtIndex: indexPath.row];

    }

    return cell;

}

 //搜索内容改变  实时搜索

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText;

{

//

  NSLog(@"%i",[_dataList count]);

if (searchText!=nil && searchText.length>0) {

///判断搜索内容不为空

//创建显示数据

     self.showData= [NSMutableArray array];

  for (NSString *tempStr in _dataList) {

//遍历原始数据

  if ([tempStr rangeOfString:searchText options:NSCaseInsensitiveSearch].length >0 {

//满足判断 加入显示数组

[_showData addObject:tempStr]; }

        }

//刷新数据

[_tableView reloadData];

}else 

{

//没有满足条件的 就将原始数据添加显示  并刷新数据

self.showData = [NSMutableArray arrayWithArray:_dataList];

  [_tableView reloadData];

    }

}

 //搜索键被点击

-(void) searchBarSearchButtonClicked:(UISearchBar *)searchBar {

[self searchBar:self.searchBar textDidChange:nil];

//释放键盘

    [_searchBar resignFirstResponder];

}



控件的初始化:

1._searchBar = [[UISearchBar alloc]initWithFrame:CGRectMake(0, 0, 320, 40)]; 

2._searchBar.placeholder = @"test";   //设置占位符 

3._searchBar.delegate = self;   //设置控件代理 

当然,做完这些工作之后,我们还要在将控件添加到父视图之上,也可以把他设置成UITableViewtableHeaderView属性值

 

协议方法  时间点

1.        //搜索框中的内容发生改变时 回调(即要搜索的内容改变)
2.        - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{ 
3.            NSLog(@"changed"); 
4.            if (_searchBar.text.length == 0) { 
5.                [self setSearchControllerHidden:YES]; //控制下拉列表的隐现
6.            }else{ 
7.                [self setSearchControllerHidden:NO]; 
8.          
9.            } 
10.  
11.   
12.  - (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar { 
13.      searchBar.showsCancelButton = YES; 
14.      for(id cc in [searchBar subviews])

    {

        if([cc isKindOfClass:[UIButton class]])

        {

            UIButton *btn = (UIButton *)cc;

            [btn setTitle:@"取消"  forState:UIControlStateNormal];

        }

    }
15.      NSLog(@"shuould begin"); 
16.      return YES; 
17.  
18.   
19.  - (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar { 
20.      searchBar.text = @""; 
21.      NSLog(@"did begin"); 
22.  
23.   
24.  - (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar { 
25.      NSLog(@"did end"); 
26.      searchBar.showsCancelButton = NO; 
27.   
28.  
29.   
30.  - (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar { 
31.      NSLog(@"search clicked"); 
32.  
33.   
34.  //点击搜索框上的 取消按钮时 调用
35.  - (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar { 
36.      NSLog(@"cancle clicked"); 
37.      _searchBar.text = @""; 
38.      [_searchBar resignFirstResponder]; 
39.      [self setSearchControllerHidden:YES]; 
40.  

 

 

 

下拉列表框我们用一个控制器来实现,我们新建一个控制器SearchViewController.

1.@interface SearchViewController : UITableViewController 

2. 

3.@end 

 .m 文件中,我们实现该控制器

1.- (id)initWithStyle:(UITableViewStyle)style 

2.

3.    self = [super initWithStyle:style]; 

4.    if (self) { 

5.        // Custom initialization 

6.    } 

7.    return self; 

8.

9. 

10.                         - (void)viewDidLoad 

11.                         

12.                             [super viewDidLoad]; 

13.                          

14.                             self.tableView.layer.borderWidth = 1; 

15.                             self.tableView.layer.borderColor = [[UIColor blackColor] CGColor]; 

16.                          

17.                         

然后实现控制器的数据源,

 

1.#pragma mark - 

2.#pragma mark Table view data source 

3. 

4.- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 

5.    return 1; 

6.

7. 

8. 

9.- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 

10.                             // 返回列表框的下拉列表的数量

11.                             return 3; 

12.                         

 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

13.                              

14.                             static NSString *CellIdentifier = @"Cell"; 

15.                             UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

16.                             if (cell == nil) { 

17.                                 cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] ; 

18.                             } 

19.                              

20.                             // Configure the cell... 

21.                            NSUInteger row = [indexPath row]; 

22.                           cell.textLabel.text = @"down list"

23.                             return cell; 

24.                         

这样列表框的控制器就实现了。接下来我们就来看看怎么让出现、隐藏。这点我们利用UIView的动画效果来实现,我们在DownListViewController控制器中 增加一个方法:

1.- (void) setSearchControllerHidden:(BOOL)hidden { 

2.    NSInteger height = hidden ? 0: 180; 

3.    [UIView beginAnimations:nil context:nil]; 

4.    [UIView setAnimationDuration:0.2]; 

5.    [_searchController.view setFrame:CGRectMake(30, 36, 200, height)]; 

6.    [UIView commitAnimations]; 

7.

我们只需调用该方法就可以了。现在我们看看DownListViewController的布局方法

1.- (void)viewDidLoad 

2.

3.    [super viewDidLoad]; 

4.    _searchBar = [[UISearchBar alloc]initWithFrame:CGRectMake(0, 0, 320, 40)]; 

5.    _searchBar.placeholder = @"test"; 

6.    _searchBar.delegate = self;  

7.     

8.    _tableview = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain]; 

9.    _tableview.dataSource = self; 

10.                             _tableview.tableHeaderView = _searchBar; 

11.                              

12.                             _searchController = [[SearchViewController alloc] initWithStyle:UITableViewStylePlain]; 

13.                             [_searchController.view setFrame:CGRectMake(30, 40, 200, 0)]; 

14.                              

15.                             [self.view addSubview:_tableview]; 

16.                             [self.view addSubview:_searchController.view]; 

17.                         

这样一切都搞定了。

 

好了,总结一下:

我们用了两个控制器:DownListViewController(搜索框的实现 和 控制下拉列表框的出现与隐藏)和SearchViewController(下拉列表框的实现)。在DownListViewController中我们声明并初始化 UISearchBarSearchViewController(高度开始设置为零),用动画来实现下拉列表框的出现与隐藏。



- (void)viewDidLoad

{

    //去除SearchBar的背景

    [[_searchBarOf_Ready.subviews objectAtIndex:0] setHidden:YES];

    [[_searchBarOf_Ready.subviews objectAtIndex:0] removeFromSuperview];

    for (UIView *subview in _searchBarOf_Ready.subviews) {

    if ([subview isKindOfClass:NSClassFromString(@"UISearchBarBackground")]) {

 [subview removeFromSuperview];

        break;

        }

    }

    [super viewDidLoad];

    //Do any additional setup after loading the view from its nib.

}

 

1、修改UISearchBar的背景颜色  

UISearchBar是由两个subView组成的,一个是UISearchBarBackGround,另一个是UITextField. IB中没有直接操作背景的属性。方法是直接将 UISearchBarBackGround移去  

  1. seachBar=[[UISearchBar alloc] init];  
  2. seachBar.backgroundColor=[UIColor clearColor];  
  3. for (UIView *subview in seachBar.subviews) 
  4. {    
  5. if ([subview isKindOfClass:NSClassFromString(@"UISearchBarBackground")])  
  6.        {    
  7. [subview removeFromSuperview];    
  8. break;  
  9. }   

第二种解决的方法:

  1. [[searchbar.subviews objectAtIndex:0]remove
  2. FromSuperview]; 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值