2010-10-27 23 views
13

Tengo un TableView con TextFields en cada celda y quiero que esos campos de texto ignoren la pestaña de caracteres (\t).Ignorar carácter de tabulación en UITextField ... (aplicación para iPad)

Cuando se pulsa la tecla de tabulación, el método textField:shouldChangeCharactersInRange no se llama

¿Alguien sabe cómo hacer esto? Sé que no hay una tecla de tabulación en el teclado del iPad , pero las de blutooth y dock lo hacen y desencadenan un comportamiento realmente extraño.

Gracias

Respuesta

0

¿Usted ha intentado comprobar otros personajes de la serie que está llamando con shouldChangeCharactersInRange? Eso se asegurará de que no se llame correctamente (especialmente si se trata de un problema con la tecla de tabulación).

más en shouldChangeCharactersInRange here

+0

Hola .. sí, estoy usando el delegado para comprobar si hay valores específicos a veces, pero cuando Pulso la tecla de tabulación, el método no se llama – Omer

2

Compruebe para asegurarse de que el delegado de la UITextField se establece ya sea en IB o código. Compruebe para asegurarse de que su archivo .h tenga el UITextFieldDelegate especificado

Todo debería funcionar ahora.

+0

Hola ... los delegados trabaja con otros caracteres, estoy usando esos para hacer otras comprobaciones – Omer

3

Esto parece ser un problema con el carácter de tabulación (\t). Este personaje no se maneja como caracteres normales (por ejemplo, a, b, c, 0, 1, 2, ...) y por lo tanto no siempre va a ser llamado el método delegado

   - (BOOL)textField:(UITextField *)textField 
    shouldChangeCharactersInRange:(NSRange)range 
       replacementString:(NSString *)string; 

.

El resultado de utilizar una pestaña en, p. Ej. un teclado externo o en el simulador es que un campo de texto actualmente activo renuncie su primer estado de respuesta y el resultado de

[textField nextResponder] 

se convertirá en primer nivel de respuesta en su lugar.

Lo OMI actualmente es un bicho (iOS SDK 4.3) es que el método delegado

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField 

sólo se le llama una vez (cuando regrese sí) y cuando se vuelve a seleccionar el mismo campo de texto y utilizar la tecla de tabulación de nuevo , el método no se llamará de nuevo.

+0

'- [UIResponder nextResponder]' devuelve la supervista, no la siguiente vista de clave válida , y '-textFieldShouldEndEditing:' solo está destinado a validar el contenido del campo de texto; podría renunciar a la primera respuesta de todos modos, y sería difícil eliminar la ambigüedad entre el momento en que se llamó debido a un toque frente a una pulsación de tecla. – lemnar

2

Creo que esto es posible, pero difícil. Básicamente, trataré de garantizar que cuando el campo de texto se convierta en el primer respondedor, ninguna otra vista pueda convertirse en el primer respondedor. Entonces, al presionar la pestaña no hará nada. Luego, deberá invertir este efecto cuando se seleccione otra vista que realmente podría convertirse en el primer respondedor, o cuando el campo de texto salga del primer respondedor.

1

implementar este método:

Añadir esto en su AppDelegate.m

- (NSArray *)keyCommands { 
static NSArray *commands; 

static dispatch_once_t once; 
dispatch_once(&once, ^{ 
    UIKeyCommand *const forward = [UIKeyCommand keyCommandWithInput:@"\t" modifierFlags:0 action:@selector(ignore)]; 
    UIKeyCommand *const backward = [UIKeyCommand keyCommandWithInput:@"\t" modifierFlags:UIKeyModifierShift action:@selector(ignore)]; 

    commands = @[forward, backward]; 
}); 

return commands; 
} 

Añadir este método en el ViewController.mo subclase de UITextField en el que desea controlar el evento clave TAB

- (void)ignore { 

    NSLog(@"Your Action"); 
} 

se describe en: How do you set the tab order in iOS?

Cuestiones relacionadas