Изменить заголовок кнопки поиска UISearchBar / Keyboard - PullRequest
54 голосов
/ 24 апреля 2010

В элементе управления UISearchBar есть способ изменить заголовок клавиши поиска для клавиатуры на Готово?

Ответы [ 10 ]

97 голосов
/ 25 апреля 2010

Для панели поиска с именем tablesearchbar:

// Set the return key and keyboard appearance of the search bar
        for (UIView *searchBarSubview in [tableSearchBar subviews]) {

            if ([searchBarSubview conformsToProtocol:@protocol(UITextInputTraits)]) {

                @try {

                    [(UITextField *)searchBarSubview setReturnKeyType:UIReturnKeyDone];
                    [(UITextField *)searchBarSubview setKeyboardAppearance:UIKeyboardAppearanceAlert];
                }
                @catch (NSException * e) {

                    // ignore exception
                }
            }
        }
48 голосов
/ 28 января 2015

По крайней мере, для iOS 8, просто:

    [self.searchBar setReturnKeyType:UIReturnKeyDone];
43 голосов
/ 05 сентября 2013

Начиная с iOS 7 beta 5, ответ Run Loop не работал для меня, но это сработало:

for(UIView *subView in [searchBar subviews]) {
    if([subView conformsToProtocol:@protocol(UITextInputTraits)]) {
         [(UITextField *)subView setReturnKeyType: UIReturnKeyDone];
    } else {
        for(UIView *subSubView in [subView subviews]) {
            if([subSubView conformsToProtocol:@protocol(UITextInputTraits)]) {
                [(UITextField *)subSubView setReturnKeyType: UIReturnKeyDone];
            }
        }      
    }
}
18 голосов
/ 24 января 2012

Еще один полезный совет в разделе Run Loop (в разделе "@try").

Включена кнопка «Готово», когда текстовое поле пусто:

UITextField *tf = (UITextField *)searchBarSubview;
tf.enablesReturnKeyAutomatically = NO;
12 голосов
/ 06 мая 2016

Для Swift, чтобы изменить ключ возврата UISearchBar

searchBar.returnKeyType = UIReturnKeyType.done

перечисление доступно как ниже

public enum UIReturnKeyType : Int {

    case default
    case go
    case google
    case join
    case next
    case route
    case search
    case send
    case yahoo
    case done
    case emergencyCall
    @available(iOS 9.0, *)
    case continue
}
2 голосов
/ 28 сентября 2016

Просто напоминание! Если searchBar остается первым респондентом, после изменения returnKeyType необходимо отменить клавиатуру и снова открыть ее, чтобы увидеть изменения.

search.resignFirstResponder()
searchBar.returnKeyType = UIReturnKeyType.Done
search.becomeFirstResponder()
1 голос
/ 26 августа 2013

Поскольку это протокол с дополнительными методами, вы должны тестировать каждый метод отдельно, а не пытаться поймать.

for (UIView *searchBarSubview in searchBar.subviews)
{
    if ([searchBarSubview conformsToProtocol:@protocol(UITextInputTraits)])
    {
        // keyboard appearance
        if ([searchBarSubview respondsToSelector:@selector(setKeyboardAppearance:)])
            [(id<UITextInputTraits>)searchBarSubview setKeyboardAppearance:UIKeyboardAppearanceAlert];
        // return key 
        if ([searchBarSubview respondsToSelector:@selector(setReturnKeyType:)])
            [(id<UITextInputTraits>)searchBarSubview setReturnKeyType:UIReturnKeyDone];
        // return key disabled when empty text
        if ([searchBarSubview respondsToSelector:@selector(setEnablesReturnKeyAutomatically:)])
            [(id<UITextInputTraits>)searchBarSubview setEnablesReturnKeyAutomatically:NO];
        // breaking the loop when we are done
        break;
    }
}

Это будет работать для iOS <= 6. Для iOS> = 7 вам нужнозацикливаться на searchBar.subviews[0].subviews.

0 голосов
/ 02 февраля 2016

Только для покрытия всех версий iOS:

NSArray *subviews = [[[UIDevice currentDevice] systemVersion] floatValue] < 7 ? _searchBar.subviews : _searchBar.subviews[0].subviews;

for (UIView *subview in subviews)
{
    if ([subview conformsToProtocol:@protocol(UITextInputTraits)])
    {
        UITextField *textField = (UITextField *)subview;
        [textField setKeyboardAppearance: UIKeyboardAppearanceAlert];
        textField.returnKeyType = UIReturnKeyDone;
        break;
    }
}
0 голосов
/ 10 января 2014

Я перепробовал все решения, показанные здесь, и ни одно из них не сработало для моего UISearchBar (компиляция xcode5 для iOS7). Я закончил с этой рекурсивной функцией, которая работала для меня:

- (void)fixSearchBarKeyboard:(UIView*)searchBarOrSubView {

    if([searchBarOrSubView conformsToProtocol:@protocol(UITextInputTraits)]) {
        if ([searchBarOrSubView respondsToSelector:@selector(setKeyboardAppearance:)])
            [(id<UITextInputTraits>)searchBarOrSubView setKeyboardAppearance:UIKeyboardAppearanceAlert];
        if ([searchBarOrSubView respondsToSelector:@selector(setReturnKeyType:)])
            [(id<UITextInputTraits>)searchBarOrSubView setReturnKeyType:UIReturnKeyDone];
        if ([searchBarOrSubView respondsToSelector:@selector(setEnablesReturnKeyAutomatically:)])
            [(id<UITextInputTraits>)searchBarOrSubView setEnablesReturnKeyAutomatically:NO];
    }

    for(UIView *subView in [searchBarOrSubView subviews]) {
        [self fixSearchBarKeyboard:subView];
    }
}

Я тогда назвал это так:

_searchBar = [[UISearchBar alloc] init];
[self fixSearchBarKeyboard:_searchBar];
0 голосов
/ 13 августа 2011

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

Итак, я редактировал черный UIImageView в положение за клавиатурой, когда текст редактируется. Это создает видимость полностью черной клавиатуры.

- (void)textFieldDidBeginEditing:(UITextField *)textField {

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.25]; 

    blackBoxForKeyboard.frame = CGRectMake(0, 377, 320, 216);
    [UIView commitAnimations]; 

}
...