有时候Search Bar上的Cancel按钮真的很讨厌,你可以在IB中去掉它,从属性面板中去掉showscancel button前的小勾就可以了。但是,当你点击搜索栏的text field时,这个Cancel按钮又出来了:
怎样去掉这个阴魂不散的Cancel按钮呢?关键是怎样获得它。我们祭出无敌的“subviews”大法,看看它在哪里:for(UIView* v in searchBar.subviews) {
NSLog(@"%d:%@",i,[[v class]description]);
i++;
}
将这段代码加到viewDidLoad方法,运行程序:
0:UISearchBarBackground
1:UISearchBarTextField
2:UIImageView
恩?居然没找到。
那么这个Cancel按钮应该是在运行时加到SearchBar的subviews里的。我们在SearchBarController中发现4个委托方法,应该是和SearchBar的UI有关:
-(void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller;
我们在View Controller中把这4个委托方法统统实现了,分别加入代码打印SearchBar控件的subviews 。终于在其中两个方法中发现一些不一样的东西:
-[SearchVCsearchDisplayControllerWillBeginSearch:]
0:UISearchBarBackground
1:UISearchBarTextField
2:UIImageView
-[SearchVCsearchDisplayControllerDidBeginSearch:]
0:UISearchBarBackground
1:UISearchBarTextField
2:UIImageView
3:UINavigationButton
-[SearchVCsearchDisplayControllerWillEndSearch:]
0:UISearchBarBackground
1:UISearchBarTextField
2:UIImageView
3:UINavigationButton
-[SearchVCsearchDisplayControllerDidEndSearch:]
0:UISearchBarBackground
1:UISearchBarTextField
2:UIImageView
发现了吗?中间的两个方法找到了一个UINavigationButton!
在searchDisplayControllerDidBeginSearch:方法中,调用下面方法,即可获得Cancel按钮了:
-(UIButton*)getSearchBarCancelButton{
UIButton* btn=nil;
for(UIView* v in searchBar.subviews) {
if ([visKindOfClass:UIButton.class]) {
btn=(UIButton*)v;
break;
}
}
return btn;
}
当然,获取Cancel按钮也不一定都的像上面那样辛苦。我们发现SearchBar有一个实例变量叫做_cancelButton,我们通过这个实例变量就可以直接获得CancelButton:
object_getInstanceVariable(searchBar,"_cancelButton",&btn);
现在,我们可以修改Cancel按钮的属性或者kill掉它了。
UIButton* btn=[selfgetSearchBarCancelButton];
if (btn!=nil) {
// 在这里修改Cancel按钮
……
}
然而,程序运行时,我们发现,当点击搜索栏text field时,Cancel按钮仍然会有短暂的显示,这个小瑕疵我还没有想到什么办法去掉它,如果你找到了解决办法,麻烦你告诉我。
我在 SearchVCsearchDisplayControllerWillBeginSearch中怎么着都隐藏不了“cancel”按钮,原来是这样啊
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。