iphone UISearchBar кнопка "Готово" всегда включена

У меня UIViewController с UISearchBar. Я заменил кнопку "Поиск" кнопкой "Готово".

Однако при нажатии на панель поиска кнопка «Готово» изначально становится disabled. Это происходит до тех пор, пока не будет введен какой-либо символ.

Я хочу, чтобы эта кнопка «Готово» всегда enabled, чтобы, если я нажму на нее, я могу немедленно отключить клавиатуру.

Любая помощь? это было бы очень признательно.

У меня на UIViewController

-(BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar  
{   
    return YES;  
}  

-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
    [searchBar resignFirstResponder];
}  

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText  
{  
    if (searchBar.text.length == 0)  
    {  
        //[self fixOrientation];  
        [searchBar resignFirstResponder];  
    }   
    else  
    {  
        NSLog(@"typed");  
    }  
}  


-(void)searchBarTextDidBeginEditing:(UISearchBar *)theSearchBar  
{  
    NSLog(@"began");  // this executes as soon as i tap on the searchbar, so I'm guessing this is the place to put whatever solution is available  
}  

person David Homes    schedule 18.01.2011    source источник


Ответы (10)


В настоящее время UISearchBar соответствует UITextInputTraits. Вы можете просто установить:

searchBar.enablesReturnKeyAutomatically = NO;

ПРЕДУПРЕЖДЕНИЕ. Во время компиляции для iOS 7.0 произойдет сбой во время выполнения. Работает только для> = 7.1.

В документации нет ясности по этому поводу, поскольку только начиная с 7.1 UISearchBar реализует протокол UITextInputTraits, но не указано, с какой версии iOS этот протокол принят.

person fabb    schedule 24.03.2015
comment
красиво и просто! возвращался к этому старому вопросу, так как я перемещаю некоторые oooooold приложения на 64 бита и забыл решение для конкретного варианта использования - person David Homes; 15.04.2017

Вы можете обойти это, перебирая подпредставления в UISearchBar, пока не найдете текстовое поле. Затем просто установите для параметра "enableReturnKeyAutomatically" значение NO. Кстати, следующий код также полезен для установки типа клавиатуры.

  // loop around subviews of UISearchBar
  for (UIView *searchBarSubview in [searchBar subviews]) {    
    if ([searchBarSubview conformsToProtocol:@protocol(UITextInputTraits)]) {    
      @try {
        // set style of keyboard
        [(UITextField *)searchBarSubview setKeyboardAppearance:UIKeyboardAppearanceAlert];

        // always force return key to be enabled
        [(UITextField *)searchBarSubview setEnablesReturnKeyAutomatically:NO];
      }
      @catch (NSException * e) {        
        // ignore exception
      }
    }
  }
person AndyDunn    schedule 05.04.2011
comment
Неужели это так сложно для этой простой глупости? - person user4951; 13.11.2012
comment
Последний раз проверял, да, к сожалению, это так. - person AndyDunn; 06.12.2012
comment
Действительно ли нужна попытка / уловка? - person James Kuang; 14.08.2013
comment
Кажется, это больше не работает. Пожалуйста, обратите внимание на категорию, которую я опубликовал. - person Gujamin; 17.09.2013
comment
Как уже говорилось, это не работает с более новыми версиями SDK. Причина: это проверяет только подпредставления, но не подвиды подвидов, и иерархия представлений изменилась в какой-то момент между SDK / iOS 6 и 8. - person eselk; 14.03.2015

Принятый ответ, похоже, больше не работает, поэтому я создал свою собственную категорию, которая, похоже, работает:

@implementation UISearchBar (enabler)

- (void) alwaysEnableSearch {
    // loop around subviews of UISearchBar
    NSMutableSet *viewsToCheck = [NSMutableSet setWithArray:[self subviews]];
    while ([viewsToCheck count] > 0) {
        UIView *searchBarSubview = [viewsToCheck anyObject];
        [viewsToCheck addObjectsFromArray:searchBarSubview.subviews];
        [viewsToCheck removeObject:searchBarSubview];
        if ([searchBarSubview conformsToProtocol:@protocol(UITextInputTraits)]) {
            @try {
                // always force return key to be enabled
                [(UITextField *)searchBarSubview setEnablesReturnKeyAutomatically:NO];
            }
            @catch (NSException * e) {
                // ignore exception
            }
        }
    }
}
person Gujamin    schedule 17.09.2013
comment
это тоже работает (по крайней мере, на ios 9. не уверен в другом): if ([self.searchBar responsedsToSelector: NSSelectorFromString (@searchField)]) {UITextField searchTextField = ((UITextField) [self. searchBar valueForKey: @searchField]); searchTextField.enablesReturnKeyAutomatically = NO; } - person codrut; 02.11.2015

Для iOS 8 и выше вы можете использовать

[self.searchBar setReturnKeyType:UIReturnKeyDone];
[self.searchBar setEnablesReturnKeyAutomatically:NO];
person Burhanuddin Sunelwala    schedule 28.04.2016
comment
у меня все работает нормально, я просто отказываюсь от клавиатуры, когда пользователь нажимает кнопку «Готово». Итак, для меня это работает нормально. - person Hiren kanetiya; 25.05.2016

Простое и легкое решение для iOS 10 на XCode 8.3.3, хотя на то, чтобы разобраться, потребовалось время :)

@IBOutlet var searchBar: UISearchBar! {
    didSet {
        searchBar.returnKeyType = .done
        searchBar.enablesReturnKeyAutomatically = false
    }
}

Изменяет поиск на Готово. Включает "Готово", не вводя ничего в поле поиска. После этого -> searchBar.resignFirstResponder () вот так:

func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
    searchBar.resignFirstResponder()
}
person Dusan Juranovic    schedule 01.08.2017
comment
:) Ты в конце концов понял это? :) Всегда найдется кто-то, кто сможет этим воспользоваться. Рад помочь, ура! - person Dusan Juranovic; 02.08.2017

Установите для enableReturnKeyAutomatically значение false

enableReturnKeyAutomatically

searchBar.enablesReturnKeyAutomatically = false
person kamalraj venkatesan    schedule 13.09.2018

Этот код отображает кнопку поиска, если у вас пустая строка:

- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar
{
    [itemSearchBar setShowsCancelButton:YES];
    UITextField *searchBarTextField = nil;
    for (UIView *subView in self.itemSearchBar.subviews)
    {
        for (UIView *sndSubView in subView.subviews)
        {
            if ([sndSubView isKindOfClass:[UITextField class]])
            {
                searchBarTextField = (UITextField *)sndSubView;
                break;
            }
        }
    }
    searchBarTextField.enablesReturnKeyAutomatically = NO;
    return YES;
}
person Himanshu padia    schedule 10.02.2014
comment
Более вероятно, что это снова сломается, если иерархия представлений изменится. Рекомендую использовать стиль, подобный ответу Гуджамина, или рекурсивную функцию. - person eselk; 14.03.2015

Например, на основе приложения «Карты» кажется, что в шаблоне должна быть кнопка отмены рядом с текстовым полем, чтобы избавиться от клавиатуры. С учетом сказанного, можно было бы предложить разместить пользовательский UIButton прямо в этом углу, который выглядит так же, как кнопка Готово.

Этакое хакерское решение ...

Надеюсь это поможет!

person donkim    schedule 19.01.2011
comment
mmmmmjm, чтобы не убеждать в этом (размещение кнопки в этом углу). Кажется, я однажды видел в сети, как это делается, но мне не удалось найти его снова - person David Homes; 20.01.2011
comment
@AndyDunn, maaaan, спустя долгое время я понял, что ваше решение действительно правильное! Я прошу прощения за то, что не попробовал, когда вы писали. Извините, большое время. Я всегда ценю время, которое другие вкладывают в помощь другим здесь - person David Homes; 02.08.2011
comment
Ага, это шаблон, который подходит для поиска типа UISearchDisplayController. Проверьте iBooks, там нет кнопки Отмена. - person Rudolf Adamkovič; 02.02.2013

Самый простой и сложный способ - просто поставить пробел в начале редактирования поиска.

-(void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar{
    //Add a blank character to hack search button enable
    searchBar.text = @" ";}
person JasonD    schedule 27.05.2013

Расширение для Swift:

extension UISearchBar {
    var textField: UITextField? {
        return getTextField(inViews: subviews)
    }

    private func getTextField(inViews views: [UIView]?) -> UITextField? {
        guard let views = views else { return nil }

        for view in views {
            if let textField = (view as? UITextField) ?? getTextField(inViews: view.subviews) {
                return textField
            }
        }

        return nil
    }
}

Использование:

searchBar.textField?.returnKeyType = .Done
searchBar.textField?.enablesReturnKeyAutomatically = false
person Anton Plebanovich    schedule 19.12.2016