Изменение Названия Кнопки UISearchBar / Keyboard Search
в элементе управления UISearchBar можно ли изменить название клавиши поиска для клавиатуры на готово?
10 ответов:
для панели поиска с именем 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 } } }
начиная с 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]; } } } }
еще одна полезная подсказка, к Запустить Цикл код (в разделе "@try").
эта включенная кнопка "готово", когда текстовое поле пусто:
UITextField *tf = (UITextField *)searchBarSubview; tf.enablesReturnKeyAutomatically = NO;
для 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 }
просто напоминание! Если панель поиска остается в качестве первого ответчика, после изменения типа returnKeyType необходимо закрыть клавиатуру и снова открыть ее, чтобы увидеть изменения.
search.resignFirstResponder() searchBar.returnKeyType = UIReturnKeyType.Done search.becomeFirstResponder()
поскольку это протокол с дополнительными методами, вы должны тестировать каждый метод отдельно, а не пытаться поймать.
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 = 7, вам нужно зациклиться
searchBar.subviews[0].subviews
.
поскольку клавиатуры в стиле оповещения полупрозрачны, я могу видеть свое представление за ним. Это выглядит не очень хорошо, так как у меня есть несколько элементов за клавиатурой, что затрудняет выделение клавиш. Я хотел полностью черную клавиатуру.
поэтому я анимировал черный UIImageView в положение за клавиатурой, когда текст редактируется. Это дает вид полностью черной клавиатуры.
- (void)textFieldDidBeginEditing:(UITextField *)textField { [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:0.25]; blackBoxForKeyboard.frame = CGRectMake(0, 377, 320, 216); [UIView commitAnimations]; }
Я пробовал все решения, показанные здесь, и ни один из них не работал для моего 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];
только для покрытия всех версий 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; } }