您的位置:首页 > 产品设计 > UI/UE

UISearchDisplayController搜索(iOS8前)

2015-06-01 20:48 459 查看
搜索功能,基本每个app标配。

实现起来很简单,但是iOS8后苹果建议使用UISearchController,官方Demo:Table Search with UISearchController

实际开发基本也都还是用的老的UISearchDisplayController+UISearchBar的方案,因为要照顾一些版本低的用户。

发现时间长没写都忘记差不多了,闲暇之余,一起整理下,方便以后翻阅。

这篇先从UISearchDisplayController开始。比较简单,就不罗嗦了,直接贴代码。

UITableView步骤略去。

新建一个UISearchBar

_searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 44)];
_searchBar.delegate = self;
_searchBar.placeholder = @"搜索";
_searchBar.backgroundColor = [UIColor clearColor];


根据searchBar新建一个UISearchDisplayController

_searchDisplayCtl = [[UISearchDisplayController alloc] initWithSearchBar:_searchBar contentsController:self];
_searchDisplayCtl.delegate = self;
_searchDisplayCtl.searchResultsDataSource = self;
_searchDisplayCtl.searchResultsDelegate = self;


设置tableView的tableHearderView为searchBar

_tableView.tableHeaderView = _searchBar;


更改searchBar的Cancel按钮为“取消”,注意:因为iOS7后和之前的层次结构不同,iOS7前遍历一次即可拿到,iOS7后需要遍历两次,在UISearchBar的代理方法中设置

//change searchBar's Cancel button to “取消”,注意:因为iOS7后和之前的层次结构不同,iOS7前遍历一次即可拿到,iOS7后需要遍历两次
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
{
//要先让cancelBtn显示,否则设置不了title
searchBar.showsCancelButton = YES;

//设置title为“取消”
for (id sView in searchBar.subviews)
{
if ([sView isKindOfClass:[UIButton class]])
{
[(UIButton *)sView setTitle:@"取消" forState:UIControlStateNormal];
break;
}
for (id ssView in [sView subviews])
{
if ([ssView isKindOfClass:[UIButton class]])
{
[(UIButton *)ssView setTitle:@"取消" forState:UIControlStateNormal];
}
}
}
}


最后一步,搜索展示结果。UISearchDisplayController代理中处理

#pragma mark - UISearchDisplayController
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
[_resultList removeAllObjects];

for (NSString *subString in _dataList)
{
if ([subString rangeOfString:searchString].location != NSNotFound)
{
[_resultList addObject:subString];
}
}

return YES;
}


  最简便的一个搜索完成了,UISearchBar和UISearchDisplayController还提供给我们很多其他的代理方法,都是些常规读名取意型的,就不一一介绍了,实际用到了看下就可以了。苹果封装的已经很好,而且UI也蛮漂亮的,所以我们也没必要自己写一个。

  不过,实际过程中有两点可能会用到。网上也挺多资料,大概整理下。方便以后查找使用。

更改UISearchBar的背景

    项目中可能会有需要我们改变其背景颜色或者背景图片的需求,其大概实现原理类似更改cancel按钮的title。需要注意的还是iOS版本不同,searchBar的层次结构不同

先设置searchBar的背景透明   

    _searchBar.backgroundColor = [UIColor clearColor];

  2. 移除掉searchBar的UISearchBarBackground,可以打印看下searchBar的层次结构。这里有篇整理好的文章,想了解的也可以看下: UISearchBar在iOS不同版本下的层次结构

    > 采用了类别的方式来添加方法。代码:

      [_searchBar removeShadow];

    > UISearchBar类别中添加方法。代码:

- (void)removeShadow
{

UIView *sView = [self findViewWithClassName:@"UISearchBarBackground"];
[sView removeFromSuperview];

// 低于7.0版本的需要重新设置下搜索textField边框属性
if ([[[UIDevice currentDevice] systemVersion] floatValue] < 7.0)
{
for( UIView *subview in self.subviews )
{
if ([subview isKindOfClass:[UITextField class]])
{
UITextField *textField = (UITextField *)subview;
textField.borderStyle = UITextBorderStyleNone;
textField.layer.borderWidth = 1.f;
textField.layer.borderColor = [UIColor clearColor].CGColor;
textField.layer.cornerRadius = 14.0f;
textField.background = nil;
textField.backgroundColor = [UIColor whiteColor];
break;
}
}
}

}


    > UIView类别中添加方法,代码:

- (UIView *)findViewWithClassName:(NSString *)className
{
return [self findViewWithClass:NSClassFromString(className)];
}

- (UIView *)findViewWithClass:(Class)class
{
if ([self isKindOfClass:class]) {
return self;
}

for (UIView *subView in self.subviews)
{
// 这里采用递归是因为iOS7以后需要遍历两次才能拿到
UIView *retView = [subView findViewWithClass:class];

if (retView)
{
return retView;
}
}

return nil;
}


  3. 移除掉后,我们可以自定义一个UIView加上背景颜色或者UIImageView添加背景图片,然后将其插入searchBar中。当然也可以不移除的情况下直接插入,只不过插入的下标不同。注意区分

UIView *cusView = [[UIView alloc] initWithFrame:_searchBar.bounds];
cusView.backgroundColor = [UIColor orangeColor];
// 这里如果前面移除了,index = 0 ,没有移除index = 1
[_searchBar insertSubview:cusView atIndex:0];


  

关于ScopeBar

   ScopeBar,先贴两张图,相信大家一看就知道是什么了。

    


    


   

  知道是什么,就够了,实际真的用到了,帮大家找了个资料,比较详尽: ScopeBar的使用 我就不啰嗦了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: