今天在iOS项目中添加一个新的feature,其中用到了iOS提供的SearchBar。该控件用于搜索场景,非常好用,Apple把许多工作都已经封装好了,以至于用起来有点傻瓜式的感觉。
在我的案例场景中,需要用到SearchBar自带的cancel按钮。当输入搜索条件点击键盘上的搜索按钮即开始search(出于XXX原因,我们抛弃了实时搜索功能),这个时候需要隐藏键盘,当searchBar失去焦点后,cancel按钮是灰掉的。另一种情况是,点击键盘上的隐藏键盘按钮,当键盘隐藏后,searchBar也会失去焦点,这时候cancel按钮也是灰掉的。
如何让cancel按钮在searchBar失去焦点后还保持可用呢?
一时没啥想法,所以在网上google了一把,刚好看到有一个论坛里面有一个人发帖问了同样的问题。回帖中有一个解决办法是,在searchBar失去焦点后在searchBar的subView中找出cancel,并设置其enabled属性为YES。
代码如下:
-(void)searchBarResignFirstResponder
{
[self.searchBar resignFirstResponder];
NSArray *subViews=[self.searchBar subviews];
for(id view in subViews)
{
if([view isKindOfClass:[UIButton class]])
{
UIButton *button = (UIButton *)view;
button.enabled=YES;
break;
}
}
}
注:这里只考虑SearchBar中只有一个UIButton的情况。
尝试了一把,上面这种做法确实能在某些情况下既能让searchBar失去焦点又能保持cancel按钮的焦点。
之所以说“在某些情况下”,因为当点击软键盘上的隐藏键盘按钮让键盘隐藏时,searchBar会失去焦点,但这个时候cancel按钮并不能保持焦点。
隐藏键盘按钮的动作完全是系统接管的,所以上面的处理方式就使不上劲了。问题发展到这里,我突然有个想法,何不在键盘隐藏之后做一些事情呢,这样就算是系统接管了隐藏键盘的动作,那我们还是可以加入自己的定制。
于是乎,注册了键盘隐藏消息的监听:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(searchBarResignFirstResponder) name:UIKeyboardDidHideNotification object:nil];
果然,这样确实能解决第二个问题。
但是这种做法下会引入一个新的问题:cancel按钮会有个快速闪动的过程。问题不算大,但总归让人感觉有点怪。
究其原因,系统在隐藏键盘时,让searchBar失去焦点,这时cancel按钮也会失去焦点;当我们收到键盘隐藏的消息后,会让cancel按钮再次可用;所以就出现了上面的闪动现象。
说到底还是解决第二个问题的方法有点问题,但目前也没有更好的想法,这个问题只能暂时搁浅。