Hace algún tiempo os comenté como detectar cambios en propiedades mediante el KVO (Key-Value Observing) hoy veremos como hacer lo mismo con notificaciones.
La idea del ejemplo es la siguiente: Tenemos un objeto A de una clase X, del que queremos ser avisados cuando una propiedad sea modificada, para ello avisaremos a otro objeto B, para que éste último realize alguna acción. Para ello usaremos notificaciones, el objeto A enviará una notificación cuando cambie su propiedad y el objeto B estará pendiente de dichas notificaciones.
Veamos como hacer esto desde el código, primero nos creamos una función que será la encargada de enviar las notificaciones. Usamos el centro de notificaciones por defecto de nuestra aplicación y el método postNotificationName:object: para enviar la notificación. Los parámetros son un string para el nombre de la notificación y el objeto que envía la notificación.
#pragma mark - #pragma mark Notification methods - (void)sendNumberPadPressedNotification { [[NSNotificationCenter defaultCenter] postNotificationName:@"number pad pressed" object:self]; }
Después sólo tenemos que llamar a esta función cada vez que queramos notificar del evento o cambio producido, por ejemplo si pulsamos un botón.
#pragma mark - #pragma mark Notification methods - (IBAction)ceroButtonPushed:(id)sender { [input setString:[numberFormater stringFromNumber:[NSNumber numberWithFloat:0.00]]]; coma = NO; decimal = 1; [self sendNumberPadPressedNotification]; }
En la última línea llamamos a nuestro método y la notificación es enviada, en este ejemplo se usa para avisar de que input fue cambiado.
Esto es todo lo que necesita nuestro objeto A (el que avisa del cambio o evento). Veamos ahora el código para el objeto B (el que quiere ser avisado).
Lo primero que tenemos que hacer es registrar el objeto B en el centro de notificaciones para poder recibirlas, obviamente nos tenemos que registrar en el mismo centro de notificaciones que el objeto A, en este caso el centro por defecto.
Usamos para ello el método addObserver:selector:name:object: los parámetros son: el objeto a registrar, un selector del método que queremos ejecutar al recibir la notificación, el nombre de la notificación para la que queremos ser avisados y el objeto sobre el que queremos ser avisado, éste último puede ser nil o el objeto en concreto, para poder diferenciar quien manda la notificación en caso de tener más de un objeto enviando la misma notificación.
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { [super viewDidLoad]; numberPadController = [[GenericNumberPad alloc] initWithNibName:@"GenericNumberPad" bundle:[NSBundle mainBundle] frame:CGRectMake(20, 190, 280, 216)]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(numberPadPressed) name:@"number pad pressed" object:nil]; [[self view] addSubview:[numberPadController view]]; }
Cómo veis en el código, el nombre de la notificación es el mismo que se usó en el objeto A. Ya sólo queda que realiceis vuestras acciones en el método que indicasteis a la hora de registrar el objeto B.
#pragma mark - #pragma mark Notification methods - (void)numberPadPressed { [importLabel setText:[numberPadController input]]; }
En este ejemplo se ha usado para actualizar una etiqueta con el valor de la variable input, cada vez que ésta era cambiado.



