UISearchBar x кнопка нажата

Как обрабатывать событие при нажатии кнопки "x"?

Я пробую этот метод, но не работает.

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

}

enter image description here

Ответы

Ответ 1

Я не думаю, что есть простой способ зацепиться за кнопку X.

Тем не менее, вы можете подключиться к его прямому следствию: очищенный текст.

Попробуй это:

func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
    if searchText == "" {
        print("UISearchBar.text cleared!")
    }
}

Побочный эффект также вызван, когда вы вручную очищаете текст.

Ответ 2

Довольно хакерский способ сделать это, но это работает.

private var didTapDeleteKey = false

func searchBar(_ searchBar: UISearchBar,
               shouldChangeTextIn range: NSRange,
               replacementText text: String) -> Bool
{
    didTapDeleteKey = text.isEmpty

    return true
}

func searchBar(_ searchBar: UISearchBar,
               textDidChange searchText: String)
{
    if !didTapDeleteKey && searchText.isEmpty {
        // Do something here
    }

    didTapDeleteKey = false
}

Успех этого кода зависит от того, что при нажатии кнопки очистки на панели поиска searchBar(_:shouldChangeTextIn:replacementText:) → Bool не вызывается. Вместо этого, когда нажимается кнопка удаления на клавиатуре, вызывается метод.

Ответ 3

У меня была одна и та же проблема, я попытался ее решить, обратившись к поисковому элементу searchBar subview textField, но это вызвало крах моего приложения, и с последним усилием я нашел этот пост.

Другая проблема заключалась в том,

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText

вызывается дважды при нажатии кнопки отмены, см. также это.

И последнее, что я сделал;

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    if (![searchText isEqualToString:self.searchText]) {
        self.searchText = searchText;
        return;
    }
    NSLog(@"Clear clicked");
}

Это решило мою проблему.

Ответ 4

Это работает для меня

-(UITextField*)getUITexfieldInUISearchBar:(UIView*)aSearchBar{
UITextField *searchBarTextField;
for (UIView *subView in [aSearchBar subviews]){
    if ([subView isKindOfClass:[UITextField class]])
    {
        searchBarTextField = (UITextField *)subView;
        [searchBarTextField setDelegate:self];
        break;

    }else if ([subView isKindOfClass:[UIView class]]){
        [self getUITexfieldInUISearchBar:subView];
    }
}
  return searchBarTextField;
}

И вы можете использовать делегат TextFields

- (BOOL)textFieldShouldClear:(UITextField *)textField {
   //Do something here...
}

Ответ 5

Вы можете подключиться к событию "Отменить кнопку", выбрав "UISearchBarDelegate", а затем внедрить метод "SearchBarCancelButtonClicked"

Ответ 6

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String){
    print("searchText: \(searchText)")
    if searchText.count > 0
    {
        // Show ur content
    }
    else
    {
        // Hide your content
    }
}

Ответ 7

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    if (searchText.length == 0) {
         //clear button (x) on the search bar is cliecked, so clear the table
        [self clearTable];
    }
}

Ответ 8

... просто работает

if(searchText.length==0||searchText==nil){
    [self.searchBar resignFirstResponder];
    [NSTimer scheduledTimerWithTimeInterval:0.1
                                     target:self
                                   selector:@selector(hideKeyboard)
                                   userInfo:nil
                                    repeats:NO];
}

- (void)hideKeyboard{
   [self.searchBar resignFirstResponder];
}

Ответ 9

Самое простое решение в Swift 5.0

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    if searchText.isEmpty {
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
            searchBar.resignFirstResponder()
        }
    }
}

Ответ 10

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {


    let inputString = searchText.trimmingCharacters(in: NSCharacterSet.whitespacesAndNewlines)

    if inputString.characters.count > 0
    {

    }
    else
    {
          //Write code here for Clear button action
    }
}