修改Search Bar上的Cancel按钮-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

修改Search Bar上的Cancel按钮

杨冬芳 2016-07-01 18:59:59 1895

有时候Search Bar上的Cancel按钮真的很讨厌,你可以在IB中去掉它,从属性面板中去掉showscancel button前的小勾就可以了。但是,当你点击搜索栏的text field时,这个Cancel按钮又出来了:screenshot
怎样去掉这个阴魂不散的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按钮仍然会有短暂的显示,这个小瑕疵我还没有想到什么办法去掉它,如果你找到了解决办法,麻烦你告诉我。

文章出处:http://blog.csdn.net/kmyhy/article/details/7066762

cancel修改 cancel修改按钮 bar按钮 lang修改 cancel按钮
分享到
取消 提交回答
全部回答(1)
  • 杨冬芳
    2019-07-17 19:50:21

    我在 SearchVCsearchDisplayControllerWillBeginSearch中怎么着都隐藏不了“cancel”按钮,原来是这样啊

    0 0
云计算
使用钉钉扫一扫加入圈子
+ 订阅

时时分享云计算技术内容,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。

最新问题