最近常常用到搜索类的布局,大致是这样的app
上面是一个navigationController,接下来一个searchBar,下面是tableView布局
searchBar这个控件就用来搜索tableView上的数据测试
[[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];spa
UISearchDisplayController这个控件很强大,它初始化是基于searchBar的,里面有些效果很不错,apple都封装好了,而且能够很好的支持实时搜索,即咱们只须要将搜索出来的数据从新赋给array(这个array用来存储tableView数据),不须要reloadData,就会自动出来代理
其实reloadData也没用,为何呢?由于搜索出来的结果显示在tableView上,该tableView并非当前布局的那个tableView,而是另一个,我猜想应该是UISearchDisplayController里面自带的,因此不要混淆了it
特别是在tableView代理方法里,有时候须要判断代理方法传入的tableView是否为当前布局的tableView,由于也有多是UISearchDisplayController里自带的,它们一样会触发代理方法io
当点击searchBar时,它会自动上移而且遮住navigationControllertable
通过测试,若是上面是navigationBar,则searchBar不会移动,但若是是UINavigationController自带过来的,则会上移覆盖搜索
每每有的时候都是UINavigationController自带过来的,若是使用UISearchDisplayController,searchBar就会自动覆盖,这个状况我试了不少次,包括新建立了一个navigationBar盖在上面,但效果依然很差,对于这种状况,基于我目前的技术,只能舍弃UISearchDisplayController,单纯的用UISearchBar了,虽然效果差了一些,但须要实现的功能照样能够,好比实时搜索,除了从新赋值给array外,额外的操做就是须要reloadData了。方法
有时候点击searchBar时,右侧可能没有出现‘cancel/取消’按钮,这时须要调用下面的方法
- (void)setShowsCancelButton:(BOOL)showsCancelButton animated:(BOOL)animated
相信看方法名字就知道是作什么的了