UITextView subclass como delegado de sí mismo

Digamos que agrego un UITextView a mi UIView , y quiero que cambie su color de background cada vez que cambian los contenidos. Puedo hacerlo convirtiéndome en el delegado de UITextView e implementando textViewDidChange .

Sin embargo, si estoy usando este comportamiento con frecuencia, tiene sentido crear una subclass UITextView , que llamaré ColorSwitchingTextView . Debería include el comportamiento de cambio de color de manera pnetworkingeterminada, de modo que cualquier UIView puede simplemente agregarlo en lugar de un UITextView estándar si quiere ese comportamiento.

¿Cómo detecto cambios en el contenido de mi class ColorSwitchingTextView ? No creo que pueda hacer algo como self.delegate = self .

En resumen, ¿cómo puede una subclass UITextView saber cuándo cambian sus contenidos?

EDIT Parece que puedo usar self.delegate = self , pero esto significa que el UIViewController que usa ColorSwitchingTextView tampoco puede suscribirse a las notifications. Una vez que uso switchingTextView.delegate = self en el controller de vista, el comportamiento de la subclass ya no funciona. ¿Alguna solución? Estoy tratando de get un UITextView personalizado que de otro modo funciona como un UITextView regular.

En su subclass, escuche la notificación UITextViewTextDidChangeNotification y actualice el color de background cuando reciba la notificación, así:

 /* * When you initialize your class (in `initWithFrame:` and `initWithCoder:`), * listen for the notification: */ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myTextDidChange) name:UITextViewTextDidChangeNotification object:self]; ... // Implement the method which is called when our text changes: - (void)myTextDidChange { // Change the background color } - (void)dealloc { // Stop listening when deallocating your class: [[NSNotificationCenter defaultCenter] removeObserver:self]; } 

Es mejor hacerlo desde el principio.

Lo que sugieren Apple y SOLID es subclass, no UITextView, sino UIView . En su UIColorTextView personalizado, tendrá el miembro UITextView como subvista y su UIColorTextView será su delegado. Además, su UIColorTextView tendrá su propio delegado y pasará las devoluciones de llamada de delegado requeridas desde UITextView a su delegado.

Tenía una tarea como esta, no con UITextView pero con UIScrollView.

En su subclass, agregue self como observador a UITextViewTextDidChangeNotification .

Dicho esto, no estoy de acuerdo con la conversación en curso que establecer como un delegado es una mala idea. Para este caso particular, seguro, pero solo porque hay una mejor manera (UITextViewTextDidChangeNotification).

Puede usar NSNotificationCenter.

Establezca el delegado en la subclass (nunca lo intentó, pero dijo que funciona), luego en el controller de vista que desea recibir notifications, haga

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldDidBeginEditing:) name:@"TextFieldDidNotification" object:nil]; 

y en la subclass:

 NSDictionary *userInfo = [NSDictionary dictionaryWithObject:self forKey:@"textField"]; [[NSNotificationCenter defaultCenter] postNotificationName:@"TextFieldDidBeginEditingNotification" object:self userInfo:userInfo] 

Ahora también puedes pasar cualquier otra información en el dictionary.