IOS之表视图添加搜索栏
下面是我们要实现的效果。本效果是在上一篇自定义表视图的基础上进行更改的。

1.将Search bar and search display拖动到ViewController中。不要添加Search Bar.

2.修改ViewController的头文件
- #import <UIKit/UIKit.h>
- @interface IkrboyViewController4 : UIViewController
- {
- NSArray *dataArr;//用于显示表视图的数据
- NSArray *allDataArr;//存储所有数据,通过关键词搜索将搜索结果赋值给dataArr
- }
- @property (weak, nonatomic) IBOutlet UISearchBar *searchBar;
- @end
#import <UIKit/UIKit.h> @interface IkrboyViewController4 : UIViewController
{
NSArray *dataArr;//用于显示表视图的数据
NSArray *allDataArr;//存储所有数据,通过关键词搜索将搜索结果赋值给dataArr
}
@property (weak, nonatomic) IBOutlet UISearchBar *searchBar; @end
3.修改自定义方法initTableViewData。将ScopeBar隐藏是考虑到iphone的显示高度问题。可自行决定。
- -(void)initTableViewData{
- NSBundle *bundle = [NSBundle mainBundle];
- NSString *plistPath = [bundle pathForResource:@"user_head" ofType:@"plist"];
- allDataArr = [[NSArray alloc] initWithContentsOfFile:plistPath];
- dataArr = [NSArray arrayWithArray:allDataArr];
- NSLog(@"table data count = %d",[allDataArr count]);
- //设定搜索栏ScopeBar隐藏
- [self.searchBar setShowsScopeBar:NO];
- [self.searchBar sizeToFit];
- }
-(void)initTableViewData{
NSBundle *bundle = [NSBundle mainBundle];
NSString *plistPath = [bundle pathForResource:@"user_head" ofType:@"plist"];
allDataArr = [[NSArray alloc] initWithContentsOfFile:plistPath];
dataArr = [NSArray arrayWithArray:allDataArr];
NSLog(@"table data count = %d",[allDataArr count]);
//设定搜索栏ScopeBar隐藏
[self.searchBar setShowsScopeBar:NO];
[self.searchBar sizeToFit];
}
4.添加SearchBar的三个事件触发
- //以下三个方法实现SearchBar的搜索功能
- //当文本内容发生改变时候,向表视图数据源发出重新加载消息
- - (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
- {
- [self filterContentForSearchText:searchString scope:self.searchBar.selectedScopeButtonIndex];
- //YES情况下表视图可以重新加载
- return YES;
- }
- // 当Scope Bar选择发送变化时候,向表视图数据源发出重新加载消息
- - (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption
- {
- [self filterContentForSearchText:self.searchBar.text scope:searchOption];
- // YES情况下表视图可以重新加载
- return YES;
- }
- //点击cancel按钮的事件
- - (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar
- {
- //查询所有
- [self filterContentForSearchText:@"" scope:-1];
- }
//以下三个方法实现SearchBar的搜索功能
//当文本内容发生改变时候,向表视图数据源发出重新加载消息
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
[self filterContentForSearchText:searchString scope:self.searchBar.selectedScopeButtonIndex];
//YES情况下表视图可以重新加载
return YES;
} // 当Scope Bar选择发送变化时候,向表视图数据源发出重新加载消息
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption
{
[self filterContentForSearchText:self.searchBar.text scope:searchOption];
// YES情况下表视图可以重新加载
return YES;
} //点击cancel按钮的事件
- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar
{
//查询所有
[self filterContentForSearchText:@"" scope:-1];
}
5.自定义关键词搜索功能
- //自定义搜索方法,根据关键词从allDataArr中搜索到满足搜索条件的元素,并将匹配的数组赋值给dataArr,由于dataArr是表视图的数据源,因此表视图的记录也会随之改变。
- - (void)filterContentForSearchText:(NSString*)searchText scope:(NSUInteger)scope;
- {
- if([searchText length]==0)
- {
- //查询所有
- dataArr = [NSArray arrayWithArray:allDataArr];
- NSLog(@"dataArr count = %d",[dataArr count]);
- return;
- }
- NSPredicate *scopePredicate;
- switch (scope) {
- case 0:
- scopePredicate = [NSPredicate predicateWithFormat:@"(SELF.itemName contains[c] %@) OR (SELF.itemImagePath contains[c] %@)",searchText,searchText];
- NSLog(@"searchText=%@",searchText);
- dataArr =[NSArray arrayWithArray:[allDataArr filteredArrayUsingPredicate:scopePredicate]];
- break;
- case 1:
- scopePredicate = [NSPredicate predicateWithFormat:@"SELF.itemName contains[c] %@",searchText];
- dataArr = [NSArray arrayWithArray:[allDataArr filteredArrayUsingPredicate:scopePredicate]];
- break;
- case 2:
- scopePredicate = [NSPredicate predicateWithFormat:@"SELF.itemImagePath contains[c] %@",searchText];
- dataArr =[NSArray arrayWithArray:[allDataArr filteredArrayUsingPredicate:scopePredicate]];
- break;
- }
- }
//自定义搜索方法,根据关键词从allDataArr中搜索到满足搜索条件的元素,并将匹配的数组赋值给dataArr,由于dataArr是表视图的数据源,因此表视图的记录也会随之改变。
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSUInteger)scope;
{
if([searchText length]==0)
{
//查询所有
dataArr = [NSArray arrayWithArray:allDataArr];
NSLog(@"dataArr count = %d",[dataArr count]);
return;
} NSPredicate *scopePredicate; switch (scope) {
case 0:
scopePredicate = [NSPredicate predicateWithFormat:@"(SELF.itemName contains[c] %@) OR (SELF.itemImagePath contains[c] %@)",searchText,searchText];
NSLog(@"searchText=%@",searchText);
dataArr =[NSArray arrayWithArray:[allDataArr filteredArrayUsingPredicate:scopePredicate]];
break;
case 1:
scopePredicate = [NSPredicate predicateWithFormat:@"SELF.itemName contains[c] %@",searchText];
dataArr = [NSArray arrayWithArray:[allDataArr filteredArrayUsingPredicate:scopePredicate]];
break;
case 2:
scopePredicate = [NSPredicate predicateWithFormat:@"SELF.itemImagePath contains[c] %@",searchText];
dataArr =[NSArray arrayWithArray:[allDataArr filteredArrayUsingPredicate:scopePredicate]];
break;
}
}
6.修改cellForRowAtIndexPath方法
- - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
- {
- static NSString *CellIdentifier = @"myTableCell";
- MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
- //add code begin:important,for showing searching results
- //不对cell进行空值的判断,会导致在搜索时,找不到对应identifier的cell而报错。
- if (cell == nil) {
- //搜索结果采用简单表视图cell的style,并非自定义的表视图cell的style
- cell = [[MyTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
- NSUInteger row = [indexPath row];
- NSDictionary *rowDict = [dataArr objectAtIndex:row];
- cell.textLabel.text = [rowDict objectForKey:@"itemName"];
- NSString *imagePath = [rowDict objectForKey:@"itemImagePath"];
- cell.imageView.image = [UIImage imageNamed:imagePath];
- }
- //add code end
- NSUInteger row = [indexPath row];
- NSDictionary *rowDict = [dataArr objectAtIndex:row];
- cell.label.text = [rowDict objectForKey:@"itemName"];
- NSLog(@"cell.label.text = %@",[rowDict objectForKey:@"itemName"]);
- NSString *imagePath = [rowDict objectForKey:@"itemImagePath"];
- cell.image.image = [UIImage imageNamed:imagePath];
- NSLog(@"cell.image.image = %@",imagePath);
- cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
- return cell;
- }
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"myTableCell";
MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
//add code begin:important,for showing searching results
//不对cell进行空值的判断,会导致在搜索时,找不到对应identifier的cell而报错。
if (cell == nil) {
//搜索结果采用简单表视图cell的style,并非自定义的表视图cell的style
cell = [[MyTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
NSUInteger row = [indexPath row];
NSDictionary *rowDict = [dataArr objectAtIndex:row];
cell.textLabel.text = [rowDict objectForKey:@"itemName"];
NSString *imagePath = [rowDict objectForKey:@"itemImagePath"];
cell.imageView.image = [UIImage imageNamed:imagePath];
}
//add code end NSUInteger row = [indexPath row];
NSDictionary *rowDict = [dataArr objectAtIndex:row];
cell.label.text = [rowDict objectForKey:@"itemName"];
NSLog(@"cell.label.text = %@",[rowDict objectForKey:@"itemName"]); NSString *imagePath = [rowDict objectForKey:@"itemImagePath"];
cell.image.image = [UIImage imageNamed:imagePath];
NSLog(@"cell.image.image = %@",imagePath); cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; return cell;
}
IOS之表视图添加搜索栏的更多相关文章
- IOS之表视图添加索引
我们要实现的效果如下. 1.修改ControlView.h,即添加变量dict,用于存储TabelView的数据源. #import <UIKit/UIKit.h> @interface ...
- IOS开发-表视图LV3导航控制器
学到这里感觉有点难了,其实这篇文章再草稿箱里放了好久了~ 最近对于学习的热情下降了.这不行-抓紧学习走起! 在这一章节的学习中主要针对导航控制器及表视图来建立多视图的应用, 首先要了解一些概念-- 1 ...
- iOS开发-表视图的使用
// // ViewController.m // Simple Table // // Created by Jierism on 16/7/20. // Copyright © 2016年 Jie ...
- IOS开发之表视图添加索引
我们要实现的效果如下. 1.修改ControlView.h,即添加变量dict,用于存储TabelView的数据源. #import <UIKit/UIKit.h> @interface ...
- ios中为视图添加圆角
1.使用 layer设置指定圆角 或者设定一个或几个圆角 码修 关注 2017.04.20 19:03* 字数 107 阅读 656评论 0喜欢 0 由于项目中需要给按钮左下 和左上加圆角,我司可爱的 ...
- IOS之表视图单元格删除、移动及插入
1.实现单元格的删除,实现效果如下 - (void)viewDidLoad { [super viewDidLoad]; //设置导航栏 self.editButtonItem.title = @&q ...
- iOS UITableView表视图滚动隐藏UINavigationController导航栏
UITableView 继承于UIScrollView 所以UIScrollView 的代理方法相同适用于UITableView 中 隐藏导航栏的方法为: self.navigationControl ...
- XF 表视图添加和删除行
using System;using Xamarin.Forms;using Xamarin.Forms.Xaml; [assembly: XamlCompilation (XamlCompilati ...
- 表视图控制器(TableViewController)(三) 、 表视图搜索
1 乐库的设置界面 1.1 问题 tableView分为静态(static)和动态(dynamic),之前使用的都是动态的tableView,表视图的有多少分区.有多少行以及每一行显示的内容都不是固定 ...
随机推荐
- MongoDb查询日期范围
{"AdID":"2", "CrateDate":{"$gte":ISODate("2014-10-12T16 ...
- [drp 7]转发和重定向的区别
导读:类似于response.sendRedirect(request.getContextPath()+"/servlet/item/SearchItemServlet");和r ...
- Oracle删除用户和表空间
对于单个user和tablespace 来说, 可以使用如下命令来完成. 步骤一: 删除user drop user ×× cascade 说明: 删除了user,只是删除了该user下的schem ...
- 轻松找回Win7桌面“消失”的IE9图标
打开注册表编辑器(Win+R打开运行窗口,运行regedit命令),依次展开到 [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion ...
- zedboard如何从PL端控制DDR读写(一)
看了一段时间的DDR手册,感觉大体有一点了解了,想要实际上板调试,然而实验室可用的开发板不多,拿了一块zynq板看了看,DDR确实有,但是已经集成了控制器,而且控制器还放到了PS端,PL只能通过AXI ...
- 纯servlet返回xml数据
... void doget..... response.setContentType("application/xml");//设置格式 PrintWriter out = r ...
- pcap文件格式及文件解析
第一部分:PCAP包文件格式 一 基本格式: 文件头 数据包头数据报数据包头数据报...... 二.文件头: 文件头结构体 sturct pcap_file_header { DWORD ...
- windows 8.1 MessageDialog
private Popup p; private void Button_Click(object sender, RoutedEventArgs e) { p=new Popup(); Denglu ...
- C#虚方法和覆写方法
- javascript组件化(转)
javascript组件化(转) By purplebamboo 3月 16 2015 更新日期:3月 23 2015 文章目录 1. 最简陋的写法 2. 作用域隔离 3. 面向对象 4. 抽象出ba ...