Una estrategia para explorar aquí es anular el método setDelegate: y luego reenviar algunos mensajes. Puede usar [super setDelegate: self]
para asegurarse de que sus llamadas reciban los primeros mensajes en los mensajes de delegado. En su anulación de setDelegate: configure un ivar interno, p. Ej.
- (void) setDelegate: (id<UITextFieldDelegate>) internalDelegate;
{
[setInternalDelegate: internalDelegate];
}
A continuación, para cada uno de los métodos de los delegados UITextField hacer lo suyo antes de reenviar el mensaje delegado, por ejemplo,
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;
{
// do your thing with range and replacement string
// now forward message on the 'other' delegate
[[self internalDelegate] textField: self shouldChangeCharactersInRange: range replacementString: string];
}
Por lo general, tendrá que reemplazar todos los métodos de delegado, aunque la mayor parte de todo lo que hacen ellos es una recta hacia adelante.
Actualización En los comentarios, observa que el método de reenvío plantea problemas. Si es así, entonces la delegación tradicional es el camino a seguir. (Y, en general, es el camino a seguir, aunque utilicé el delegado de reenvío una o dos veces, no estoy seguro si, en retrospectiva, fue absolutamente esencial y no lo he comprobado para ver si Hemos puesto en práctica con UITextField. @Scott Corscadden tiene y no lo recomienda.)
el patrón más común es hacer que el ViewController que se ocupa de la vista en la que el UITextField
es una subvista el delegado. No dice en su respuesta si hay una razón particular por la que necesita trabajar con la subclase. Si está empacando cosas interesantes en el UITextField
, podría ser así, aunque siempre podría haber otro cartel que sugiera y cree una clase complementaria para UITextField
que funcione y lo use como delegado. En cualquier caso, si es necesario, siempre puede obtener el objeto delegado para llamar a métodos adicionales en su subclase UITextField
, p.
// in the delegate object class
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;
{
[delegate doSomeExtraThingInTheTextFieldSubclassThatItSeemsToMakeSenseToDoThereRatherThanHere];
// maybe that's it, or maybe this object also wants to do something here...
}
Me podría aclarar? No está claro de inmediato por qué no usaría textField: shouldChangeCharactersInRange :, es decir, obtener la subclase para establecer sus instancias como sus propios delegados. – Obliquely
El único problema con establecerlo como su propio delegado es reenviar eventos a un delegado real que podría querer responder a eventos de UITextField. Actualmente, estoy usando addTarget: action: forControlEvent: para responder a esos eventos internamente. –