El delegado de UItextView no se llama utilizando un keyboard personalizado

Tengo varias subvenciones UITextView, todas con la misma interfaz de input personalizada (básicamente, un panel numérico con una opción de relleno automático y un button save).

Mi problema es que el método delegate shouldChangeCharactersInRange: no se llama cuando el text del campo de text se modifica desde mi keyboard personalizado (funciona al pegar text desde el portapapeles en los campos de text y también cuando se utiliza el keyboard numérico estándar). El text de los campos de text cambia, pero no se llama al método delegado para evitar inputs inválidas. Otros methods delegates de estilo DidBeginEditing: se llaman siempre.

a pesar de lo que se dice en este SO LINK, la documentation establece que se debería llamar al método shouldChangeCharactersInRange: delegate: "La vista de text llama a este método cada vez que el usuario escribe un nuevo carácter o borra un carácter existente".

¿Qué me estoy perdiendo?

partes de código relevantes:

ViewController.h:

@interface ManualPositionViewController : UIViewController <UITextFieldDelegate> { LocationEntryTextField *latitude; } @property (nonatomic, retain) IBOutlet LocationEntryTextField *latitude; @property (nonatomic, retain) IBOutlet LocationKeyboard *locationKeyboard; .. 

ViewController.m:

 @synthesize latitude; @synthesize locationKeyboard; self.latitude.inputView = locationKeyboard; self.latitude.delegate = self; - (void)textFieldDidBeginEditing:(LocationEntryTextField *)aTextField { NSLog(@"textFieldDidBeginEditing called!"); self.locationKeyboard.currentTextfield = aTextField; } - (BOOL)textField:(LocationEntryTextField *)editedTextField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)replacementString { NSLog(@"shouldChangeCharactersInRange called!"); NSCharacterSet *decimalSet = [NSCharacterSet decimalDigitCharacterSet]; if ([[replacementString stringByTrimmingCharactersInSet:decimalSet] isEqualToString:@""]) { NSLog(@"Result: YES"); return YES; } else { NSLog(@"Result: NO"); return NO; } } 

LocationKeyboard.h:

 #import <UIKit/UIKit.h> #import "LocationEntryTextField.h" @interface LocationKeyboard : UIView { LocationEntryTextField *currentTextfield; // track first responder } @property (weak) LocationEntryTextField *currentTextfield; - (IBAction) numberButtonPressed:(UIButton*)sender; - (IBAction) backspaceButtonPressed:(UIButton*)sender; @end - (IBAction) numberButtonPressed:(UIButton*)sender { NSString *entryString = @"test"; [self.currentTextfield replaceRange:self.currentTextfield.selectedTextRange withText:entryString]; } 

LocationEntryTextField.h:

 @interface LocationEntryTextField : UITextField .. 

Esta línea:

 [self.currentTextfield replaceRange:self.currentTextfield.selectedTextRange withText:entryString]; 

no textField:shouldChangeCharactersInRange:replacementString: una llamada a textField:shouldChangeCharactersInRange:replacementString: ¿Es eso lo que esperas?

Dado que está cambiando explícitamente el text del campo de text, no hay "tipeo" en curso.

La forma correcta de hacer que su keyboard personalizado actualice el campo de text es llamar al método 'insertText: `. Este método se ocupará adecuadamente de cualquier selección, mover el cursor y llamar a los methods de delegado.

Editar: Puede desear ver mi respuesta aquí para get una configuration de keyboard personalizada completa (less los botones reales).