2012-03-06 20 views
8

Soy nuevo en Objective-C, y estoy tratando de limitar que un usuario pase de la parte del alfabeto de un teclado normal al lado numérico/de puntuación. Dicho esto, me gustaría desactivar el botón en el teclado que hace el cambio. Tal vez estoy poniendo los parámetros de búsqueda incorrectos, pero estoy encontrando poco en Google y aún menos en mis libros de referencia. ¿Cómo voy a deshabilitar realmente un botón en un teclado iOS? Con caracteres alfanuméricos/de puntuación, esto se haría fácilmente ignorando los caracteres ingresados ​​que se ingresaron, pero el botón que alterna entre las partes del teclado realiza una acción en lugar de devolver un carácter.Deshabilitar teclas en el teclado

¡Gracias por tu ayuda!

Respuesta

4

En realidad se puede agregar y quitar botones de la opción predeterminada UIKeyboard

Hay algunas recetas en Internet como esto: http://www.iphonedevsdk.com/forum/iphone-sdk-development/6573-howto-customize-uikeyboard.html y como este: http://www.iphonedevsdk.com/forum/iphone-sdk-development/6275-add-toolbar-top-keyboard.html

Esos mensajes mostrará cómo añadir un botón, sin embargo, la el mismo principio se puede usar para eliminar.

A continuación te voy a mostrar una recopilación de una de las soluciones:

//The UIWindow that contains the keyboard view - 
//It some situations it will be better to actually 
//iterate through each window to figure out where the keyboard is, 
// but In my applications case 
//I know that the second window has the keyboard so I just reference it directly 
// 
UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] 
//      objectAtIndex:1]; 

//Because we cant get access to the UIKeyboard throught the SDK we will 
// just use UIView. 
//UIKeyboard is a subclass of UIView anyways 
UIView* keyboard; 

//Iterate though each view inside of the selected Window 
for(int i = 0; i < [tempWindow.subviews count]; i++) 
{ 
    //Get a reference of the current view 
    keyboard = [tempWindow.subviews objectAtIndex:i]; 

    //Check to see if the className of the view we have 
    //referenced is "UIKeyboard" if so then we found 
    //the keyboard view that we were looking for 
    if([[keyboard description] hasPrefix:@"<UIKeyboard"] == YES) 
    { 
     // Keyboard is now a UIView reference to the 
     // UIKeyboard we want. From here we can add a subview 
     // to th keyboard like a new button 

     //Do what ever you want to do to your keyboard here... 
    } 
} 
+0

¡Gracias! Tendré que echarle un vistazo a eso. Viniendo de un fondo Java y C/C++, a veces la forma en que Objective-C hace las cosas parece un poco, bueno, raro. – alownx

1

he implementado una solución más ordenado. El truco es colocar una imagen de tecla desactivada en la parte superior del teclado.

Para hacer esto

  1. Run emulador (en la escala de 100%) y la pantalla de agarrar el activo desea (en mi caso, se trataba de un botón Hecho con discapacidad en el extremo inferior derecho)
  2. coloca esta imagen en la parte superior del teclado

Tenga en cuenta que el teclado se coloca en un UIWindow separada (ya que IOS5 creo) y por lo tanto, tendrá que hacer lo siguiente

+ (void) addSubviewToTop:(UIView *)view { 
    int count = [[[UIApplication sharedApplication] windows] count]; 
    if(count <= 0) { 
     warn(@"addSubviewToTop failed to access application windows"); 
    } 
    UIWindow *top_window = [[[UIApplication sharedApplication] windows] objectAtIndex:count-1]; 
    [top_window addSubview:view]; 
    [top_window bringSubviewToFront:view]; 
} 
0

No estoy seguro de si el SDK ha cambiado de forma tal que la respuesta de @ ppaulojr ya no funciona, o si simplemente tengo cosas configuradas extrañamente en mi sistema, pero con los siguientes ajustes pude hacerlo funcionar.

Las publicaciones vinculadas en la respuesta de @ppaulojr son geniales (http://www.iphonedevsdk.com/forum/iphone-sdk-development/6573-howto-customize-uikeyboard.html y http://www.iphonedevsdk.com/forum/iphone-sdk-development/6275-add-toolbar-top-keyboard.html), y me ayudaron a hacer que esto funcione.

Aparentemente, la vista actual del teclado ahora está incrustada como una subvista en alguna estructura de vista de UIKeyboard más grandiosa, por lo que se trata de un poco de recurrencia. Tengo que esto funcione:

-(void) findKeyboard { 

    NSArray* windows = [[UIApplication sharedApplication] windows]; 

    for (int i = 0; i < [windows count]; i++) { 

     UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] 
                  objectAtIndex:i]; 

     for(UIView *subView in [tempWindow subviews]) 
     { 
      [self checkViews:subView]; 
     } 
    } 
} 

-(void)checkViews:(UIView *)inView 
{ 
    for(UIView *keyboard in inView.subviews) 
    { 
     NSLog(@"ViewName: %@", [keyboard description]); // Which view are we looking at 

     //Check to see if the className of the view we have 
     //referenced is "UIKeyboard" if so then we found 
     //the keyboard view that we were looking for 
     if([[keyboard description] hasPrefix:@"<UIKeyboard"] == YES) 
     { 
      // Keyboard is now a UIView reference to the 
      // UIKeyboard we want. From here we can add a subview 
      // to th keyboard like a new button 

      //Do what ever you want to do to your keyboard here... 


      break; 
     } 

     // Recurse if not found 
     [self checkViews:subView]; 
    }  
} 

También encontré que el mejor lugar para llamar a esta función es de -(void)textViewDidBeginEditing:(UITextView *)textView así:

- (void)textViewDidBeginEditing:(UITextView *)textView { 
    NSLog(@"textViewDidBeginEditing"); 

    [self findKeyboard]; 

} 

Esto hace las modificaciones de teclado tan pronto como se añade el teclado para la ventana, pero antes de que realmente aparezca, de modo que todo el tiempo que suba desde abajo, se habrá modificado.

Cuestiones relacionadas