如何修改Search Bar上的Cancel按钮

有时候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)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller;

- (void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller;

- (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller;

-(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按钮仍然会有短暂的显示,这个小瑕疵我还没有想到什么办法去掉它,如果你找到了解决办法,麻烦你告诉我。



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值