当点击取消按钮时,删除UISearchBar右侧的清除按钮(灰色x)

Dav*_*ter 23 iphone objective-c interface-builder ipad

是的,开始我的问题,这里是Spotify应用程序已经解决的问题的一些屏幕:

Spotify的第1步:标准UISearchBar未处于编辑模式.

第1步http://i49.tinypic.com/wbtpwi.png

Spotify的第2步: UISearchBar现在处于编辑模式.已输入搜索字词.取消按钮从右侧滑入,出现清除按钮(灰色x).

第2步http://i45.tinypic.com/161kbvp.png

Spotify的第3步:按下取消按钮; 键盘滑出,搜索栏不再处于编辑模式.搜索项保持不变,灰色x按钮现在隐藏.

第3步http://i46.tinypic.com/20utv9v.png

目前,在下面的代码触发关按下取消按钮:

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {
    [searchBar resignFirstResponder];
    [searchBar setShowsCancelButton:NO animated:YES];
}
Run Code Online (Sandbox Code Playgroud)

结果如下:

我的第3步:搜索栏现在不处于编辑模式.取消按钮和键盘已滑出.搜索词仍然存在,但灰色x也是如此.

问题http://i46.tinypic.com/rlm4w5.png

所以,我的问题是:假设-resignFirstResponder(并且-endEditing:,FYI)在搜索栏输入文本时没有隐藏灰色x按钮,那么如何隐藏它?

再次感谢,朋友们.

Jas*_*ien 29

问题是UISearchBar不公开它的文本字段,并管理文本字段本身的属性.有时,属性的值不是您想要的.

例如,在我自己的应用程序中,我希望我的搜索栏的键盘样式使用透明警报样式.

我的解决方案是遍历搜索栏的子视图,直到找到文本字段.然后,您应该能够clearButtonMode使用诸如UITextFieldViewModeWhileEditing参数之类的东西来设置属性.

这应该使得仅在文本字段编辑时显示清除按钮.

您希望在viewDidLoad早期或之前执行此操作,因此在开始使用之前已设置(但在搜索栏初始化之后).

for (UIView *subview in searchBar.subviews)
{
    if ([subview conformsToProtocol:@protocol(UITextInputTraits)])
    {
        [(UITextField *)subview setClearButtonMode:UITextFieldViewModeWhileEditing];
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我的错!抱歉.你需要做`[subview conformsToProtocol:@protocol(UITextInputTraits)]` (2认同)

Coo*_*ops 6

看起来iOS 7改变了UISearchBar的视图层次结构,文本框在视图中更深(上面的解决方案对我不起作用).但是,修改上述解决方案以遍历整个层次结构的工作原理:

[self configureSearchBarView:[self searchBar]];

- (void)configureSearchBarView:(UIView*)view {
    for (UIView *subview in [view subviews]){
        [self configureSearchBarView:subview];
    }
    if ([view conformsToProtocol:@protocol(UITextInputTraits)]) {
        [(UITextField *)view setClearButtonMode:UITextFieldViewModeWhileEditing];
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 似乎导致崩溃,显然有多个视图符合`UITextInputTraits`并且该视图无法响应`setClearButtonMode`. (3认同)

Wad*_*ade 6

我正在以前的答案为基础,因为我开始在iOS 7.1上看到崩溃,除非我做了以下更改.我respondsToSelector为每个视图添加了一个额外的调用,以确保setClearButtonMode:可以调用它.我观察到一个UISearchBar传入的实例,它似乎符合UITextInputTraits协议但还没有setClearButtonMode:选择器,因此发生了崩溃.UISearchBarTextField也会传入一个实例,它是要调用的实际对象setClearButtonMode:.

- (void)removeClearButtonFromView:(UIView *)view
{
    if (!view)
    {
        return;
    }

    for (UIView *subview in view.subviews)
    {
        [self removeClearButtonFromView:subview];
    }

    if ([view conformsToProtocol:@protocol(UITextInputTraits)])
    {
        UITextField *textView = (UITextField *)view;
        if ([textView respondsToSelector:@selector(setClearButtonMode:)])
        {
            [textView setClearButtonMode:UITextFieldViewModeNever];
        }
    }
}


Yog*_*mar 5

您需要获取搜索栏的 textField

UITextField *textField = [searchBar valueForKey:@"_searchField"];
textField.clearButtonMode = UITextFieldViewModeNever;
Run Code Online (Sandbox Code Playgroud)

在 - (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar 方法中使用。

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
 {

UITextField *textField = [searchBar valueForKey:@"_searchField"];
textField.clearButtonMode = UITextFieldViewModeNever;


 }
Run Code Online (Sandbox Code Playgroud)