2010-04-24 12 views

Respuesta

96

Para una barra de búsqueda tablesearchbar llamado:

// 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 
       } 
      } 
     } 
+0

Funciona. Fantástica respuesta. Muchas gracias. –

+0

Gracias JK!También me ayudó – ambertch

+0

¿Pasará esto por el proceso de aprobación de la App Store? – zekel

0

Como los teclados de estilo de alerta son semitransparentes, puedo ver mi punto de vista detrás de él. No se ve muy bien ya que tengo varios elementos detrás del teclado que dificultan que las teclas se destaquen. Yo quería un teclado negro.

Así que animé un UIImageView negro en posición detrás del teclado cuando se edita el texto. Esto da la apariencia de un teclado completamente negro.

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

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

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

} 
18

Uno más indirecta útil, al bucle de ejecución código (en "@try") sección.

Esto permitió botón "Done" cuando el campo de texto está vacío:

UITextField *tf = (UITextField *)searchBarSubview; 
tf.enablesReturnKeyAutomatically = NO; 
+1

Gracias! Esto también funciona con la solución de Gregory para iOS7. – jbandi

1

Como se trata de un protocolo con métodos opcionales, debe probar cada método por separado en lugar de tratar la atención.

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; 
    } 
} 

Esto funcionará para iOS < = 6. Para iOS> = 7, es necesario bucle en searchBar.subviews[0].subviews.

43

A partir de iOS 7 beta 5, la respuesta de bucle de ejecución no funcionó para mí, pero esto hizo:

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]; 
      } 
     }  
    } 
} 
+5

Por si acaso no está claro, la razón por la que se usa if/else es para la compatibilidad con versiones anteriores de iOS 6 y el resto es para iOS 7. –

+0

respuesta fantástica. esto funciona en iOS 7. gracias – Katushai

+0

Esto funciona en iOS8 –

0

Probé todas las soluciones que se muestran aquí, y ninguno de ellos trabajó para mi UISearchBar (xcode5 compilando para iOS7). Terminé con esta función recursiva que funcionó para mí:

- (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]; 
    } 
} 

entonces lo llamé así:

_searchBar = [[UISearchBar alloc] init]; 
[self fixSearchBarKeyboard:_searchBar]; 
+0

Con Xcode 5 + iOS7, la entrada de texto estará en una sub-subvista en lugar de una subvista. Así que básicamente usaste mi solución Xcode 4 y agregué una llamada recursiva. Para obtener mejores resultados, puede probar la versión de iOS, y si es iOS7, navegue a través de 'subviews [0] .subviews' en lugar de' subviews'. –

41

Al menos para iOS 8, simplemente:

[self.searchBar setReturnKeyType:UIReturnKeyDone]; 
0

Sólo por que cubre todas las versiones de 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; 
    } 
} 
9

para SWIFT para cambiar tecla de retorno de UISearchBar

searchBar.returnKeyType = UIReturnKeyType.Done 

enumeración disponibles son las siguientes

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

Sólo un recordatorio! Si searchBar se mantiene como primer respondedor, después de cambiar el returnKeyType, debe cerrar el teclado y volver a abrirlo para ver los cambios.

search.resignFirstResponder() 
searchBar.returnKeyType = UIReturnKeyType.Done 
search.becomeFirstResponder() 
Cuestiones relacionadas