开发者社区> 问答> 正文

修改Search Bar上的Cancel按钮

有时候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

展开
收起
杨冬芳 2016-07-01 18:59:59 2635 0
1 条回答
写回答
取消 提交回答
  • IT从业

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

    2019-07-17 19:50:21
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Cloak-And-Dagger-From-Two-Permissions-To-Complete-Control-Of-The-UI-Feedback-Loop 立即下载
AutoAlerts-From Data to Action 立即下载
低代码开发师(初级)实战教程 立即下载