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。
代码如下:
注:这里只考虑SearchBar中只有一个UIButton的情况。
尝试了一把,上面这种做法确实能在某些情况下既能让searchBar失去焦点又能保持cancel按钮的焦点。
之所以说“在某些情况下”,因为当点击软键盘上的隐藏键盘按钮让键盘隐藏时,searchBar会失去焦点,但这个时候cancel按钮并不能保持焦点。
隐藏键盘按钮的动作完全是系统接管的,所以上面的处理方式就使不上劲了。问题发展到这里,我突然有个想法,何不在键盘隐藏之后做一些事情呢,这样就算是系统接管了隐藏键盘的动作,那我们还是可以加入自己的定制。
于是乎,注册了键盘隐藏消息的监听:
果然,这样确实能解决第二个问题。
但是这种做法下会引入一个新的问题:cancel按钮会有个快速闪动的过程。问题不算大,但总归让人感觉有点怪。
究其原因,系统在隐藏键盘时,让searchBar失去焦点,这时cancel按钮也会失去焦点;当我们收到键盘隐藏的消息后,会让cancel按钮再次可用;所以就出现了上面的闪动现象。
说到底还是解决第二个问题的方法有点问题,但目前也没有更好的想法,这个问题只能暂时搁浅。
在我的案例场景中,需要用到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按钮再次可用;所以就出现了上面的闪动现象。
说到底还是解决第二个问题的方法有点问题,但目前也没有更好的想法,这个问题只能暂时搁浅。
相关文章推荐
- Android疑惑篇------------含有button按钮的ListView中,列表项无法获取焦点的问题
- 解决Listview的Item与按钮或文本框焦点的问题
- 修改UISearchBar的Cancel按钮为中文等本地化问题
- DatePicker 控件在5.0以上版本 焦点释放问题 手动输入点击确定按钮不能正确获取到日期优化
- iOS小问题---怎么改变uisearchbar中的cancel按钮的文字?
- EditText 光标闪烁;自定义键盘按钮;焦点问题
- searchbar时候,cancel按钮在收回键盘后一般不可用。如果需要设为可用,需要做以下动作
- 常见的回车焦点按钮问题
- 关于窗口与按钮焦点引起的KeyListnere失效的问题
- ListView条目中按钮或条目无法获取焦点问题
- 主窗体上按钮jig画图时,CAD得不到焦点的问题
- 更改SearchBar的“No Results“标签和”Cancel“按钮
- 解决Java按钮与当前内容的焦点问题
- ListView中item与其中的组件(按钮)的焦点获取冲突问题
- Android ListView的Item中的按钮Button和ImageButton共存、抢夺焦点问题
- UIActionSheet cancel按钮不响应的问题
- extjs 的权限问题 要求控制的对象是 菜单,按钮,URL
- jquery左右滚动焦点图banner图片鼠标经过显示上下页按钮
- iPhone、iPad默认按钮样式问题
- 关于js 提交按钮的问题