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

   

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

2.修改ViewController的头文件

  1. #import <UIKit/UIKit.h>
  2. @interface IkrboyViewController4 : UIViewController
  3. {
  4. NSArray *dataArr;//用于显示表视图的数据
  5. NSArray *allDataArr;//存储所有数据,通过关键词搜索将搜索结果赋值给dataArr
  6. }
  7. @property (weak, nonatomic) IBOutlet UISearchBar *searchBar;
  8. @end
#import <UIKit/UIKit.h>

@interface IkrboyViewController4 : UIViewController
{
NSArray *dataArr;//用于显示表视图的数据
NSArray *allDataArr;//存储所有数据,通过关键词搜索将搜索结果赋值给dataArr
}
@property (weak, nonatomic) IBOutlet UISearchBar *searchBar; @end

3.修改自定义方法initTableViewData。将ScopeBar隐藏是考虑到iphone的显示高度问题。可自行决定。

  1. -(void)initTableViewData{
  2. NSBundle *bundle = [NSBundle mainBundle];
  3. NSString *plistPath = [bundle pathForResource:@"user_head" ofType:@"plist"];
  4. allDataArr = [[NSArray alloc] initWithContentsOfFile:plistPath];
  5. dataArr = [NSArray arrayWithArray:allDataArr];
  6. NSLog(@"table data count = %d",[allDataArr count]);
  7. //设定搜索栏ScopeBar隐藏
  8. [self.searchBar setShowsScopeBar:NO];
  9. [self.searchBar sizeToFit];
  10. }
-(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的三个事件触发

  1. //以下三个方法实现SearchBar的搜索功能
  2. //当文本内容发生改变时候,向表视图数据源发出重新加载消息
  3. - (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
  4. {
  5. [self filterContentForSearchText:searchString scope:self.searchBar.selectedScopeButtonIndex];
  6. //YES情况下表视图可以重新加载
  7. return YES;
  8. }
  9. // 当Scope Bar选择发送变化时候,向表视图数据源发出重新加载消息
  10. - (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption
  11. {
  12. [self filterContentForSearchText:self.searchBar.text scope:searchOption];
  13. // YES情况下表视图可以重新加载
  14. return YES;
  15. }
  16. //点击cancel按钮的事件
  17. - (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar
  18. {
  19. //查询所有
  20. [self filterContentForSearchText:@"" scope:-1];
  21. }
//以下三个方法实现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.自定义关键词搜索功能

  1. //自定义搜索方法,根据关键词从allDataArr中搜索到满足搜索条件的元素,并将匹配的数组赋值给dataArr,由于dataArr是表视图的数据源,因此表视图的记录也会随之改变。
  2. - (void)filterContentForSearchText:(NSString*)searchText scope:(NSUInteger)scope;
  3. {
  4. if([searchText length]==0)
  5. {
  6. //查询所有
  7. dataArr = [NSArray arrayWithArray:allDataArr];
  8. NSLog(@"dataArr count = %d",[dataArr count]);
  9. return;
  10. }
  11. NSPredicate *scopePredicate;
  12. switch (scope) {
  13. case 0:
  14. scopePredicate = [NSPredicate predicateWithFormat:@"(SELF.itemName contains[c] %@) OR (SELF.itemImagePath contains[c] %@)",searchText,searchText];
  15. NSLog(@"searchText=%@",searchText);
  16. dataArr =[NSArray arrayWithArray:[allDataArr filteredArrayUsingPredicate:scopePredicate]];
  17. break;
  18. case 1:
  19. scopePredicate = [NSPredicate predicateWithFormat:@"SELF.itemName contains[c] %@",searchText];
  20. dataArr = [NSArray arrayWithArray:[allDataArr filteredArrayUsingPredicate:scopePredicate]];
  21. break;
  22. case 2:
  23. scopePredicate = [NSPredicate predicateWithFormat:@"SELF.itemImagePath contains[c] %@",searchText];
  24. dataArr =[NSArray arrayWithArray:[allDataArr filteredArrayUsingPredicate:scopePredicate]];
  25. break;
  26. }
  27. }
//自定义搜索方法,根据关键词从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方法

  1. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
  2. {
  3. static NSString *CellIdentifier = @"myTableCell";
  4. MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  5. //add code begin:important,for showing searching results
  6. //不对cell进行空值的判断,会导致在搜索时,找不到对应identifier的cell而报错。
  7. if (cell == nil) {
  8. //搜索结果采用简单表视图cell的style,并非自定义的表视图cell的style
  9. cell = [[MyTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
  10. NSUInteger row = [indexPath row];
  11. NSDictionary *rowDict = [dataArr objectAtIndex:row];
  12. cell.textLabel.text =  [rowDict objectForKey:@"itemName"];
  13. NSString *imagePath = [rowDict objectForKey:@"itemImagePath"];
  14. cell.imageView.image =  [UIImage imageNamed:imagePath];
  15. }
  16. //add code end
  17. NSUInteger row = [indexPath row];
  18. NSDictionary *rowDict = [dataArr objectAtIndex:row];
  19. cell.label.text =  [rowDict objectForKey:@"itemName"];
  20. NSLog(@"cell.label.text =  %@",[rowDict objectForKey:@"itemName"]);
  21. NSString *imagePath = [rowDict objectForKey:@"itemImagePath"];
  22. cell.image.image = [UIImage imageNamed:imagePath];
  23. NSLog(@"cell.image.image  =  %@",imagePath);
  24. cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
  25. return cell;
  26. }
- (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之表视图添加搜索栏的更多相关文章

  1. IOS之表视图添加索引

    我们要实现的效果如下. 1.修改ControlView.h,即添加变量dict,用于存储TabelView的数据源. #import <UIKit/UIKit.h> @interface  ...

  2. IOS开发-表视图LV3导航控制器

    学到这里感觉有点难了,其实这篇文章再草稿箱里放了好久了~ 最近对于学习的热情下降了.这不行-抓紧学习走起! 在这一章节的学习中主要针对导航控制器及表视图来建立多视图的应用, 首先要了解一些概念-- 1 ...

  3. iOS开发-表视图的使用

    // // ViewController.m // Simple Table // // Created by Jierism on 16/7/20. // Copyright © 2016年 Jie ...

  4. IOS开发之表视图添加索引

    我们要实现的效果如下. 1.修改ControlView.h,即添加变量dict,用于存储TabelView的数据源. #import <UIKit/UIKit.h> @interface  ...

  5. ios中为视图添加圆角

    1.使用 layer设置指定圆角 或者设定一个或几个圆角 码修 关注 2017.04.20 19:03* 字数 107 阅读 656评论 0喜欢 0 由于项目中需要给按钮左下 和左上加圆角,我司可爱的 ...

  6. IOS之表视图单元格删除、移动及插入

    1.实现单元格的删除,实现效果如下 - (void)viewDidLoad { [super viewDidLoad]; //设置导航栏 self.editButtonItem.title = @&q ...

  7. iOS UITableView表视图滚动隐藏UINavigationController导航栏

    UITableView 继承于UIScrollView 所以UIScrollView 的代理方法相同适用于UITableView 中 隐藏导航栏的方法为: self.navigationControl ...

  8. XF 表视图添加和删除行

    using System;using Xamarin.Forms;using Xamarin.Forms.Xaml; [assembly: XamlCompilation (XamlCompilati ...

  9. 表视图控制器(TableViewController)(三) 、 表视图搜索

    1 乐库的设置界面 1.1 问题 tableView分为静态(static)和动态(dynamic),之前使用的都是动态的tableView,表视图的有多少分区.有多少行以及每一行显示的内容都不是固定 ...

随机推荐

  1. CI 自动提交表单

    //coontrol $this->load->view ( '/' . $this->index_lang ['FOLDER'] . '/eprepag_form.php', $p ...

  2. 【HTML/XML 7】CSS层叠样式表

    导读:上篇博客说到用XSL去实现XML文档的表现形式的美化,那么另外一种方式就是CSS的使用.本篇博客系统的介绍CSS,下篇博客,将系统的介绍XSL. 一.CSS的发展历史 1996年,层叠样式表(C ...

  3. Jmeter笔记2:参数化(五种方法)

    案例:邮箱登录操作,参数化登录的用户名 方法一.依赖Jmeter自带的函数助手 选项-->函数助手对话框,即可打开函数助手弹窗 (1)比如使用函数_Random 输入最小值.最大值,点击下方的[ ...

  4. tcpdump抓包

    名称(NAME)tcpdump-转储网络上的数据流总览(SYNOPSIS)tcpdump[-adeflnNOpqStvx][-ccount][-Ffile] [-iinterface][-rfile] ...

  5. app开发版面设计原则

    (1) 单纯:形象和色彩必须简单明了(也就是简洁性). (2) 统一:造型与色彩必须和谐,要具有统一的协调效果. (3) 均衡:整个画面须要具有魄力感与均衡效果. (4) 展现重点:构成要素必须化繁为 ...

  6. jQuery实现的Div窗口震动效果实例

    本文实例讲述了jQuery实现的Div窗口震动效果.分享给大家供大家参考.具体如下: 这是一款jQuery窗口震动效果代码,在Div边框内点击一下鼠标,它就开始震动了,适用浏览器:IE8.360.Fi ...

  7. jquery 读取xml

    <script type="text/javascript" src="jquery/jquery-1.11.3.min.js"></scri ...

  8. 软件工程 speedsnail 冲刺2

    2015-5-6 完成任务:snail的对象: 遇到问题:关闭了speedsnail,背景音乐还在响: 明日任务:snail的移动功能.

  9. C# @Page指令中的AutoEventWireup,CodeBehind,Inherits

    AutoEventWireup 如果 Page 指令的 AutoEventWireup 属性被设置为 true(或者如果缺少此属性,因为它默认为 true) ,该页框架将自动调用页事件,即 Page_ ...

  10. Winform主窗体的设置

    软件必然涉及到一个主窗体MainForm,下面介绍一下几个简单的属性设置,可能比较有用 (1)icon,当然是咱们软件的图标了,设置上去即可 (2)isMdiContainer,这个比较重要了哦,必须 ...