[小浣熊博客地址](http://cellgit.com/2017/02/18/The%20First/)
搜索功能UI的代码
Bug描述:搜索的时候,第一次点击搜索框弹出键盘,输入文字,不点击键盘上的搜索,而是点击屏幕收起键盘,然后再次点击搜索框之后再点击搜索,并不会跳转到其它界面,或者点击取消,搜索视图依然存在,并没有移除.
问题分析步骤:
第一步,找到操作哪一步时会出现搜索视图无法移除的.
第二步,利用视图层次分析工具,查看视图层次,会发现第二次弹出键盘时,出现第二个搜索视图,因此发现原因是两个视图只会移除一个.
解决问题方法:
在弹出键盘的代理方法中判断搜索视图是否存在,如果存在,就不重新创建视图,如果为nil,创建搜索视图.
有bug的代码:
优化后的代码:
#pragma mark - 创建搜索视图
- (void)createSearchView {
LMSearchView *view = [[LMSearchView alloc]initWithFrame:CGRectMake(0, 64, self.view.bounds.size.width, self.view.bounds.size.height)];
view.backgroundColor = [UIColor lightGrayColor];
[self.tabBarController.view addSubview:view];
_searchView = view;
}
#pragma mark - UISearchBarDelegate
- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar {
// 点击时添加searchView,同时隐藏系统导航条,并且自定义导航条
if (_searchView == nil) {
[self createSearchView];
}
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"取消" style:UIBarButtonItemStyleDone target:self action:@selector(removeSearchView)];
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:@selector(removeSearchView)];
return YES;
}
二,在开发的时候,还需要注意搜索界面要设计成可以滚动的视图,即可以在scrollView上添加view,所有的标签都用collectionView布局,这样比button布局简单得多,但是要注意collectionView的标签是大小不一样的,我使用Masonry进行布局的,布局的思想和在tableViewCell中布局的思想是一样的.代码段如图所示:用label将cell撑起来,而我们知道,label的大小是可以根据文字的多少和大小而动态变化的,因此再设置cell.contentView的大小和label一致即可.不过,代码必须要自己写出来才是自己的,如果只是看懂了照搬上去下一次依然很可能写不出来.下面的代码段同时设置了一个边缘线和边缘线的颜色以及字体的颜色为随机色,并且边缘线的颜色和字体的颜色一致,这也算是一个小技巧