2011-01-18 3 views
18

У меня есть UIViewController с UISearchBar. Я заменил кнопку «Поиск» кнопкой «Готово».iphone 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 
} 

ответ

17

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

searchBar.enablesReturnKeyAutomatically = NO; 

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

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

+0

прекрасный & простой! возвращался к этому старому вопросу, так как я перемещаю некоторые приложения oooooold на 64 бит и забыл решение для конкретного случая использования –

0

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

Своеобразного Hacky решения ...

Надеются, что это помогает!

+0

mmmmmjm, не убежден в том, что один (размещение кнопки на верхней части этого угла). Я считаю, что однажды видел в Интернете, как это было сделано, но я не смог найти его снова. –

+1

@ AndyDunn, maaaan, после loooong времени я понял, что ваше решение на самом деле является правильным! Прошу прощения за то, что я не попробовал, когда вы отправили сообщение. Извините большое время. Я всегда ценю время, которое другие прикладывают к помощи другим здесь. –

+0

Да, это шаблон, который подходит для поиска 'UISearchDisplayController'. Проверьте iBooks, там нет кнопки _Cancel_. –

30

Вы можете обойти это, перейдя по подзонам в 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 
     } 
    } 
    } 
+2

Это действительно так сложно для этой простой глупой вещи? –

+0

Последний раз, когда я проверил, да, к сожалению, это так. – AndyDunn

+0

Действительно ли попытка/уловка нужна? –

0

Простейший способ и сложно просто поставить пробел при начале редактирования Поиск

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

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

@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 
      } 
     } 
    } 
} 
+1

Фантастический. Благодаря – TheMan

+2

это тоже работает (по крайней мере, на КСН 9. Не уверен, с другой стороны): если ([self.searchBar respondsToSelector: NSSelectorFromString (@ "searchField")]) { UITextField * searchTextField = ((UITextField *) [ self.searchBar valueForKey: @ "searchField"]); searchTextField.enablesReturnKeyAutomatically = NO; } – codrut

2

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

Этот код D isplay Search Button, если у вас пустая строка.

- (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; 
} 
+0

Это скорее сработает, если иерархия представлений изменится. Рекомендуйте использовать стиль, например, ответ Гуджамина или рекурсивную функцию. – eselk

4

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

[self.searchBar setReturnKeyType:UIReturnKeyDone]; 
[self.searchBar setEnablesReturnKeyAutomatically:NO]; 
+1

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

0

Расширения для 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

Простое и удобное решение для прошивки 10 на XCode 8.3. 3, хотя для выяснения этого потребовалось некоторое время :)

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

Изменения в результатах поиска. Включает выполнение, не вводя ничего в поле поиска. После этого -> searchBar.resignFirstResponder() следующим образом:

func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { 
    searchBar.resignFirstResponder() 
} 
+0

спасибо! 7 лет поздно, но спасибо;) –

+0

:) Неужели ты все понял? :) Всегда найдется кто-то, кто сможет его использовать. Рад помочь, ура! –

Смежные вопросы