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

SearchBar的cancel按钮的焦点问题

2014-01-14 21:06 531 查看
今天在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按钮再次可用;所以就出现了上面的闪动现象。

说到底还是解决第二个问题的方法有点问题,但目前也没有更好的想法,这个问题只能暂时搁浅。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息