点击X按钮时从UISearchBar中解除键盘

Jus*_*zic 18 iphone uitextfield uisearchbar

我正在使用UISearchBar(但不是通常联合使用的SearchDisplayController),当你点击'X'按钮时我想解除键盘.

我遵循了TomSwift的建议,当'X'被敲击并且效果很好时被叫.但是,从文本字段中退出第一个响应者并在UISearchBar实例中调用它们resignFirstResponder都不会使键盘消失.

当用户轻敲X按钮时,有没有办法摆脱键盘?

这是我为了获得'清除'通知而做的事情:

- (void)viewDidLoad:
{
    for (UIView* v in searchBar.subviews)
    {
        if ( [v isKindOfClass: [UITextField class]] )
        {
            UITextField *tf = (UITextField *)v;
            tf.delegate = self;
            break;
        }
    }    
}
Run Code Online (Sandbox Code Playgroud)

然后我有我的类设置来实现UISearchBarDelegate和UITextFieldDelegate.

将该类作为文本字段委托允许我接听此调用:

- (BOOL)textFieldShouldClear:(UITextField *)textField
{
     [textField resignFirstResponder];
     [self.searchBar resignFirstResponder];
     return YES;
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试了所有我能想到的东西.我正在尝试的最后一件事是找到一种方法来发出UISearchDelegate将在我的Controller类上调用的'searchBarCancelButtonClicked',但不是我确定我怎么能这样做,因为UISearchBar似乎没有任何直接方法使用此名称调用.

rad*_*iel 71

汤姆斯回答让我思考.如果用户点击清除按钮时搜索栏还不是第一个响应者,我们可以等到它,然后让它resignFirstResponder; 即沿着以下方向:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
  [self performFilteringBySearchText: searchText]; // or whatever

  // The user clicked the [X] button or otherwise cleared the text.
  if([searchText length] == 0) {
    [searchBar performSelector: @selector(resignFirstResponder) 
                    withObject: nil 
                    afterDelay: 0.1];
  }
}
Run Code Online (Sandbox Code Playgroud)

像汤姆的恕我直言一样,工作就像一个魅力,而不是hacky.


pic*_*ick 6

这有效:

[searchBar performSelector:@selector(resignFirstResponder) withObject:nil afterDelay:0.1];
Run Code Online (Sandbox Code Playgroud)


Amm*_*mad 5

已为SWIFT 3更新:

假设用户在搜索字段中输入了一个字符串,然后单击x,则当按下x时,以下代码可隐藏键盘

`

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) 
{
            if searchBar.text == nil || searchBar.text == ""
            {
                searchBar.perform(#selector(self.resignFirstResponder), with: nil, afterDelay: 0.1)
            }
 }
Run Code Online (Sandbox Code Playgroud)

`


Tom*_*ift 2

更新:

好吧,这完全是一个黑客,但我能够让它发挥作用。基本上,代码调用取消按钮的处理程序。为了使其工作,我必须延迟调用选择器,我不确定为什么会这样。另外,我必须为取消按钮编写一个访问器,就像您为文本字段所做的那样。

再说一次,这完全是一个黑客行为。我不确定我是否会自己在应用程序中执行此操作。

// this in the context of the search bar
- (UIButton*) cancelButton
{
    for (UIView* v in self.subviews)
    {
        if ( [v isKindOfClass: [UIButton class]] )
            return (UIButton*)v;
    }

    return nil;
}

// this is the textField delegate callback
- (BOOL)textFieldShouldClear:(UITextField *)textField
{
    [textField resignFirstResponder];

    UIButton* cb = _searchBar.cancelButton;

    NSObject* target = [[cb allTargets] anyObject];

    NSArray* actions = [cb actionsForTarget: target forControlEvent:UIControlEventTouchUpInside];

    NSString* selectorName = [actions  objectAtIndex:0];

    SEL selector = NSSelectorFromString( selectorName );

    [target performSelector: selector withObject: cb afterDelay: 0.1];

    return YES;
}
Run Code Online (Sandbox Code Playgroud)

原答案:

如何首先显示清晰的“X”按钮?在我的测试用例中,我没有看到它显示......

尝试在 searchBar 而不是 textField 上执行 resignFirstResponder 。