原文 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; //设置控件代理
当然,做完这些工作之后,我们还要在将控件添加到父视图之上,也可以把他设置成UITableView的tableHeaderView属性值
协议方法 时间点
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中我们声明并初始化 UISearchBar和SearchViewController(高度开始设置为零),用动画来实现下拉列表框的出现与隐藏。
- (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移去
- seachBar=[[UISearchBar alloc] init];
- seachBar.backgroundColor=[UIColor clearColor];
- for (UIView *subview in seachBar.subviews)
- {
- if ([subview isKindOfClass:NSClassFromString(@"UISearchBarBackground")])
- {
- [subview removeFromSuperview];
- break;
- }
- }
第二种解决的方法:
- [[searchbar.subviews objectAtIndex:0]remove
- FromSuperview];