1.新建工程名SearchViewController,File->New->Projectr->SingleView Application->next

2.添加协议和声明变量

还需要让类遵循UISearchBarDelegate协议,除了充当表视图的委托之外还需要让它充当搜索栏的委托。

@interface ViewController :UIViewController<UITableViewDelegate,UITableViewDataSource,UISearchBarDelegate>

{

UITableView*tableavaieGroup;

UISearchBar *search;

NSMutableDictionary *names;

NSMutableArray *keys;

BOOL isSearching;

}

3.添加plist文件,再到ViewDidLoad中初始化视图

- (void)viewDidLoad

{

//读取plist文件

NSString *path=[[NSBundlemainBundle]pathForResource:@"Property List"ofType:@"plist"];

NSDictionary *dictionary=[[NSDictionaryalloc]initWithContentsOfFile:path];

//self.names=dictionary;

self.allNames=dictionary;

//读取字典中的键存储在数组中

//NSArray *array=[[namesallKeys]sortedArrayUsingSelector:@selector(compare:)];

//self.myKey=array;

[selfresetSearch];

[tableViewGroupreloadData];

[tableViewGroupsetContentOffset:CGPointMake(0.0, 44.0) animated:NO];

[superviewDidLoad];}

4.实现委托方法

从数组中读取字典中的plist文件有几个分区

方法获取一个可重用单元,如果单元不存在则创建一个新的单元。然后从对应查询的数组中获取对象,将单元的文本设置成控制器标题并返回单元

- (UITableViewCell *)tableView:(UITableView *)tableView

cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

staticNSString*DisclosureCellIdentifier = @"DisclosureCellIdentifier";

UITableViewCell*cell=[tableView dequeueReusableCellWithIdentifier:DisclosureCellIdentifier];

if (cell == nil)

{//创建一个新的单元

cell=[[UITableViewCellalloc] initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:DisclosureCellIdentifier];

}

//对应查询数组中获取的对象,将单元文本设置成控制器标题并返回单元

NSUInteger row=[indexPath row];

NSString *rowData=[listDataobjectAtIndex:row];

cell.textLabel.text=rowData;

cell.accessoryType=UITableViewCellAccessoryDetailDisclosureButton;

return cell;

}

5.添加搜索栏委托方法

搜索栏有许多在其委托上调用的方法,当用户单击键盘上的返回按钮或搜索键时,将调用searchBarBookmarkButtonClicked,此方法从搜索栏获取搜索短语,并调用我们的搜索方法,这个搜索方法将删除names中不匹配的名称和keys中的空分区:

-(void)searchBarBookmarkButtonClicked:(UISearchBar *)searchBar

{

NSString*searchTerm=[searchBar text];

[selfhandleSearchForTerm:searchTerm];

}

运行结果如下:

(点击搜索框进行搜索“egg”,出现第二个页面)

6)NSDictinary遵循NSMutableCopying协议,该协议返回一个NSmutableDictionary,但是这个方法创建的是浅副本。也就是说调用mutableCopy方法时,它将创建一个新的NSmutableDictionary对象,该对象拥有源字典所拥有的所有对象,他们并不是副本,而是相同的实际对象,由于字典中存有数组,如果我们从副本的数组中删除对象,这些对象也会从原字典的数组中删除,因为副本和源都指向相同的对象,在这种情况下元数组是不可改变

的所以无法删除对象,解决这个问题,需要为存有数组的字典创建一个深层可变副本,

Next->  之后 Categroy on (NSDictionary) Categrpy(MutableDeepCopy)

此方法创建一个新的可变字典,然后在原字典中所有的键进行迭代,为它遇到的每个数组创建可变副本。

-(NSMutableDictionary *)mutableDeepCopy

{

NSMutableDictionary *returnDict=[[NSMutableDictionaryalloc] initWithCapacity:[selfcount]];

NSArray *keys=[selfallKeys];

//NSArray *keys=[self ];

//    因为在原有的mutableCopy 中, 只会对第一层对象进行mutable化.

//    比如NSDictionary嵌套NSArray的话.

//    原有的MutableCopy只会返回NSMutableDictionary, 而不会使其子元素也变为NSMutableArray.

//    而这种方法实际上类似递归的结构.

//循环读取复制每一个元素

for(id key in keys)

{

id oneValue=[selfvalueForKey:key];

id oneCopy=nil;

//如果key对应的元素可以响应mutableDeepCopy方法(还是NSDictionary),调用mutableDeepCopy方法复制

if([oneValue respondsToSelector:@selector(mutableDeepCopy)])

oneCopy=[oneValue mutableDeepCopy];

elseif([oneValue respondsToSelector:@selector(mutableCopy)])

oneCopy=[oneValue mutableCopy];

if(oneCopy==nil)

oneCopy=[oneValue copy];

[returnDict setValue:oneCopy forKey:key];

}

return returnDict;

}

7)要想在运行时搜索框后有一个Cancel按钮只需在Option中勾选Shows Cancel Button即可,如下图:

当用户单击Cancel按钮时,程序会将搜索短语设置为空,然后重置搜索,并重新加载数据一显示所有名称,此外,还要让搜索栏放弃第一响应者状态,这样键盘就不再起作用,以便于用户重新处理表视图。

本文转自HDDevTeam 51CTO博客,原文链接:http://blog.51cto.com/hddev/1218230,如需转载请自行联系原作者

iOS 分组索引和索引分区相关推荐

  1. phonex的使用,二级索引,预分区,调优

    文章目录 一.基本指令 1)创建表 2)删除表 3)插入数据 4)查询数据 5)删除数据 6)退出命令行 二.映射 1)视图映射 创建视图 查询视图 删除视图 2)表映射 删除表 3)视图映射和表映射 ...

  2. Script:列出失效索引或索引分区

    以下脚本可用于列出数据库中的失效的索引.索引分区.子分区: REM list of the unusable index,index partition,index subpartition in D ...

  3. oracle 建分区索引_Oracle分区表及分区索引-创建list分区

    Oracle 分区表及分区索引 - 创建 list 分区 创建 list 分区的语法如上,需要我们指定的 : l column: 分区依赖列 ( 注意:只能是一个 ); l partition: 分区 ...

  4. mysql 创建分区索引吗_MySQL分区字段列有必要再单独建索引吗?

    大家都知道对于分区字段必须是主键的一部分,那么建了复合主键之后,是否需要对分许字段再单独添加一个索引呢?有没有效果?本文主要给大家介绍了关于MySQL分区字段列是否有必要再单独建索引的相关资料,文中通 ...

  5. 【Oracle】表级别分区操作对索引(本地分区索引,全局分区索引,非分区索引)的影响

    --参考自<Oracle索引技术> 先贴上结论吧: 下面对以上几种操作分别测试: 创建测试表及索引 --创建测试分区表 CREATE TABLE employees_parttest (e ...

  6. mysql 分区 全局索引_全局分区索引与局部分区索引

    分区索引 分区索引,有是全局分区索引与局部分区索引,加上一种全局非分区索引(也就是普通索引),加起来共三种.下面我们讨论了这三种索引的组织结构以及应用场景. 1.全局非分区索引可以依赖普通的表,也可以 ...

  7. mysql5.5索引,MySQL--5索引选择原则

    大家好我是安小生,这篇文章讲述索引的选择原则. 1.explain分析语句. explain:通常是用于sql语句性能分析. 举个栗子: explain select * from user wher ...

  8. MySQL索引与索引优化

    MySQL的基本架构示意图 MySQL索引就是用于优化器上. 索引: MySQL官方对于索引的定义为:索引是帮助MySQL高效获取数据的数据结构.即可以理解为:索引是数据结构. 索引是对数据库表中一个 ...

  9. 22-08-25 MySQL高级(03)MySQL索引、索引演绎、适合加索引的情况、执行计划Explain各字段解释

    "系统,那如果我没有绑定,没有简化,我原先的人生最大的可能是怎么样的",李长生好奇一问.很快系统给出了答案. "如果宿主是小说主角的话,就活个几章" " ...

  10. MySQL 索引与索引优化

    索引与引擎 索引 重要名词 种类 哈希索引 B树索引 B+树索引 高效使用索引 避免索引失效 如何创建索引 隐式转换规则 前缀索引以及索引长度 为什么要避免使用 select * 最左前缀原则 lim ...

最新文章

  1. (转)如何从storyBoard中加载其中一个controller
  2. sybase isql 重启_学习这篇文章,搭建Sybase数据库不再是难题!
  3. 计算机网络-基本概念(9)【传输层】TCP拥塞控制 【网络层】拥塞避免
  4. XML电子口岸自动报关项目 真实百万级项目下载
  5. A - Junk-Mail Filter HDU - 2473
  6. MFC 获取其他窗口的Edit文本和单击Button
  7. windows 设置ssh登录
  8. 调查称谷歌占北美25%互联网流量
  9. SQL 不常用的一些命令sp_OACreate,xp_cmdshell,sp_makewebtask
  10. 【引用】关于close-on-exec标志
  11. 软件项目管理第4版课后习题[附解析]第九章
  12. 动力学建模~拉格朗日建模
  13. 印象笔记使用方法————印象笔记下载安装以及浏览器插件下载安装
  14. 新加坡政府将与加美两国就网络安全问题展开合作
  15. pythonqq机器人酷q_基于NoneBot的QQ聊天机器人一
  16. 【DVB】【Cert】DVD相关认证简介
  17. ThinkPHP3.2短信验证码 (创蓝253短信验证码)
  18. 设计模式-优惠券-策略模式
  19. 大数据学长面试之瓜子二手车面试题
  20. python图片截取特定部分_如何在Python中使用OpenCV提取图像的特定部分?

热门文章

  1. vb用数组方式快速导出MSFlexGrid表格数据到Excel表格中
  2. 如何自制会跳舞的AI小姐姐?这有一份易上手的开源攻略
  3. 首个教育部印发的人工智能行动计划出炉:规划三步走,大学有三任务
  4. Goodfellow“死磕”NIPS:这名字涉及色情和仇日
  5. 8Linux磁盘划分、RAID
  6. 数学建模笔记2方法分类
  7. 较为周全的Asp.net提交验证方案(Session版)
  8. 让世界没有陌生的角落共享单车时代的快与慢
  9. 性能调优之综合篇 - Linux系统性能监控和故障排查利器Sysdig
  10. 【Android】实验3 颜色、字符串资源的使用【提交截止时间:2016.4.1】