Escucha un cambio de valor de mi campo de texto

Intento entender cómo atrapar un evento de “cambio de texto” desde un campo de texto en mi ventana. Estoy acostumbrado a los “oyentes de acción” de Java, y no puedo encontrar nada similar en Objective-C / Cocoa. Busqué durante bastante tiempo y encontré el protocolo de “observación del valor de clave”, pero el método observeValueForKeyPath: ¿funciona? Cuando el valor de mi campo de texto cambió en código (usando [textfield setStringValue:...] , por ejemplo ), no escribiendo en él.

¿Cómo puedo “escuchar” el cambio de valor cuando un usuario escribe en el campo de texto?

Puede establecer un delegado para su instancia de NSTextField y hacer que el delegado implemente el siguiente método:

 - (void)controlTextDidChange:(NSNotification *)notification { // there was a text change in some control } 

Su objeto delegado puede ser el delegado de la aplicación, un controlador de ventana, un controlador de vista u otro objeto en su aplicación. El delegado se puede establecer programáticamente a través de

 [myTextField setDelegate:delegateObject]; 

o, en Interface Builder, a través de la salida de delegate disponible en el control NSTextField .

Tenga en cuenta que si hay múltiples controles enganchados al mismo delegado, se enviará -controlTextDidChange: para cada control, es decir, se llama al mismo método para diferentes controles. Si desea un comportamiento diferente según el control donde ha cambiado el texto, puede usar -[NSNotification object] para identificar el control que ha enviado la notificación.

Por ejemplo, si tiene dos campos de texto con los campos correspondientes nameField y addressField , y ha establecido el mismo delegado para ambos campos, entonces:

 - (void)controlTextDidChange:(NSNotification *)notification { // there was a text change in some control // [notification object] points to the control that has sent // the notification if ([notification object] == nameField) { // nameField has changed } else if ([notification object] == addressField) { // addressField has changed } } 

Alternativamente, podría tener un delegado para cada campo de texto. En este caso, no habría necesidad de probar [notification object] .

También puede simplemente conectarse a la “edición modificada” de IB y crear la acción para manejarlo

 - (IBAction)txtField_Changed:(id)sender { // my textfield has been changed } 

Esto funciona para mí

 func textView(textView: NSTextView, shouldChangeTextInRange affectedCharRange: NSRange, replacementString: String?) -> Bool { print("Changed!") return true } 

Puede usar textFieldShouldBeginEditing: método de UITextFieldDelegate . En iOS los oyentes se llaman NSNotifications

EDITAR

En Object-c muchos UIObjects tienen una clase de protocolo correspondiente llamada “delegate”. El delegado es responsable de reactjsr a los eventos. Entonces, para poder responder o ser notificado sobre las acciones que necesita para implementar el delegado y sus métodos.