Кнопка iphone UISearchBar Done всегда включена - PullRequest
20 голосов
/ 18 января 2011

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

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

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

Любая помощь? это будет высоко ценится.

У меня есть на моем 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  
}  

Ответы [ 10 ]

30 голосов
/ 05 апреля 2011

Вы можете обойти это, зацикливаясь на подпредставлениях в UISearchBar, пока не найдете текстовое поле. Тогда нужно просто установить «enableReturnKeyAutomatics» в значение 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
      }
    }
  }
21 голосов
/ 24 марта 2015

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

searchBar.enablesReturnKeyAutomatically = NO;

ПРЕДУПРЕЖДЕНИЕ: Хотя это скомпилируется для iOS 7.0, вылетит во время выполнения.Это работает только для> = 7.1.

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

10 голосов
/ 17 сентября 2013

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

@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
            }
        }
    }
}
4 голосов
/ 28 апреля 2016

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

[self.searchBar setReturnKeyType:UIReturnKeyDone];
[self.searchBar setEnablesReturnKeyAutomatically:NO];
2 голосов
/ 02 августа 2017

Простое и удобное решение для 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()
}
2 голосов
/ 10 февраля 2014

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

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

- (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;
}
1 голос
/ 13 сентября 2018

Установить enableReturnKeyAutomatics в значение false

enableReturnKeyAutomatics

searchBar.enablesReturnKeyAutomatically = false
0 голосов
/ 19 декабря 2016

Расширение для 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
0 голосов
/ 27 мая 2013

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

-(void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar{
    //Add a blank character to hack search button enable
    searchBar.text = @" ";}
0 голосов
/ 19 января 2011

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

Вид хакерского решения ...

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

...