2011-01-12 9 views
8

Tengo un teclado personalizado que estoy usando para editar el texto en mytextField y funciona muy bien. Sin embargo, nunca puedo obtener el delegado shouldChangeCharactersInRange para ejecutar con mi teclado personalizado. Se ejecuta cuando uso mi teclado real (obviamente no es el teclado predeterminado de iPhone, ya que estoy configurado mytextField.inputView = numberPad.view). ¿Qué debo hacer para que el delegado shouldChangeCharactersInRange se active con el teclado personalizado? Por cierto, el teclado personalizado es solo un montón de botones.¿Cómo puedo hacer que UITextFieldDelegate.shouldChangeCharactersInRange se active con inputView personalizado?

- (void) numberPadPressed: (UIButton *)sender { 
    [mytextField insertText:[[NSNumber numberWithInt:sender.tag] stringValue]]; 
} 

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 
    NSString *resultingString = [textField.text stringByReplacingCharactersInRange: range withString: string]; 
    NSLog(@"shouldChangeCharactersInRange: %@", resultingString); 
    return true; 
} 

- (void)viewDidLoad { 
    mytextField.text = @""; 
    mytextField.inputView = numberPad.view; 
    mytextField.delegate = self; 
    [mytextField becomeFirstResponder]; 
} 

Respuesta

0

Editar: lo siento, he entendido mal su pregunta anteriormente.

Su campo de texto llama shouldChangeCharactersInRange cuando se pone la entrada del teclado sistema, que le da la oportunidad de determinar si el texto debe realmente mostrar (por ejemplo, usted podría ponerlo en práctica para reconocer un acceso directo e insertar un texto más largo). Pero el campo de texto no reconoce la entrada de su vista personalizada como entrada de texto.

Si usted tiene un inputView costumbre, no es necesario invocar este método - acaba de actualizar el campo de texto directamente desde su IBAction:

- (IBAction) numberPadPressed: (UIButton *)sender { 
    NSString *newText = [[mytextField text] stringByReplacingCharactersInRange:[mytextField selectedRange] withString:string]; 
    [mytextField setText:newText]; 
} 
+0

Acabo de probar utilizando su sugerencia anterior, pero todavía shouldChangeCharactersInRange no se inició cuando se llama numberPadPressed. Creo que estamos en el camino correcto ... – docchang

+0

¿Cómo calcularé el rango? ¿Hay alguna manera de mover el cursor en cualquier posición particular en un TextField? – docchang

+0

Actualicé el ejemplo de código. Utilice [mytextField selectedRange] para obtener el rango seleccionado, que será solo un punto de inserción si no hay selección, o será un rango de caracteres si hay una selección. –

10

Nunca se tiene la shouldChangeCharactersInRange llamada con un teclado personalizado .

Lo que puede obtener es el evento UIControlEventEditingChanged del UITextField. Por lo tanto, en lugar de confiar en el método shouldChangeCharactersInRange (que también se conoce como error), debe confiar en este evento, que se activará cada vez que el usuario cambie el contenido del campo de texto.

[textField addTarget:self action:@selector(myTextfieldChangedMethod:) forControlEvents:UIControlEventEditingChanged]; 

Si modifica a sí mismo el campo de texto con su teclado personalizado, a llamar a este método para notificar a todos los oyentes del evento UIControlEventEditingChanged.

[textField sendActionsForControlEvents:UIControlEventTouchUpInside]; 
+0

Su 'forControlEvents' debe coincidir con su 'sendActionsForControlEvents' –

0

Sé que esta es una pregunta anterior, pero me encontré con el mismo problema al necesitar compatibilidad con dispositivos anteriores a la 5.0. Si reemplaza InsertText: siguiendo las instrucciones de Rob al http://dev.ragfield.com/2009/09/insert-text-at-current-cursor-location.html, obtendrá shouldChangeCharactersInRange para disparar todo el tiempo.

Si este caso es necesario para apoyar la tecla de retroceso como si lo hizo usted puede utilizar la respuesta de @cormacrelf en How to simulate the delete key on UITextField?

La única bodrio que no he podido evitar es que cuando se elimina un personaje de en el medio de la cadena, el cursor salta al final de la cadena.

Cuestiones relacionadas