cocoa observer-pattern nstextfield nsnotifications

cocoa - Notificación de cambio de texto para un NSTextField



observer-pattern nsnotifications (4)

Me gustaría usar el código de la respuesta a esta pregunta: Cómo observar el valor de un NSTextField en un NSTextField para observar los cambios en la cadena almacenada en NSTextField.

[[NSNotificationCenter defaultCenter] addObserverForName:NSTextViewDidChangeSelectionNotification object:self.textView queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note){ NSLog(@"Text: %@", self.textView.textStorage.string); }];

La clase utilizada aquí es una NSTextView. No puedo encontrar una notificación en NSTextField para usar en lugar de NSTextViewDidChangeSelectionNotification.

¿Hay alguna notificación disponible en NSTextField que pueda usarse en este caso?



En Swift es

public override func controlTextDidChange(_ obj: Notification) { }


Si solo desea detectar cuándo ha cambiado el valor de un campo de texto, puede utilizar el método controlTextDidChange: delegar que NSTextField hereda de NSControl .

Simplemente conecte la toma de delegate de NSTextField en el archivo de punta a su clase de controlador e implemente algo como esto:

- (void)controlTextDidChange:(NSNotification *)notification { NSTextField *textField = [notification object]; NSLog(@"controlTextDidChange: stringValue == %@", [textField stringValue]); }

Si está creando el programa NSTextField programación, puede usar el NSTextField setDelegate: después de la creación para especificar el delegado:

NSTextField *textField = [[[NSTextField alloc] initWithFrame:someRect] autorelease]; [textField setDelegate:self]; // or whatever object you want

La delegación es uno de los patrones de diseño fundamentales utilizados en todo el cacao. En resumen, le permite personalizar fácilmente el comportamiento de los objetos estándar (en este caso, los objetos de la interfaz de usuario) sin la complejidad que implica tener que subclasificar el objeto para agregar ese comportamiento adicional. Por ejemplo, otra forma de nivel inferior para detectar cuándo ha cambiado el texto en un campo de texto podría ser crear su propia subclase NSTextField personalizada en la que sobrescriba el método keyDown: que NSTextField hereda de NSResponder . Sin embargo, la creación de subclases de este tipo es difícil porque puede requerir que tenga un conocimiento profundo de la jerarquía de herencia del objeto. Para obtener más información, definitivamente mira lo siguiente:

Guía de conceptos básicos de Cocoa: delegados y fuentes de datos

Respecto a lo que significa id <NSTextFieldDelegate> significa un objeto genérico ( id ) que se declara conforme al protocolo <NSTextFieldDelegate> . Para obtener más información sobre los protocolos, consulte El lenguaje de programación Objective-C: Protocolos .

Proyecto de muestra GitHub en: https://github.com/NSGod/MDControlTextDidChange


Xcode 9.2. con Swift 4.0.3.

El NSTextField se debe conectar mediante el constructor de interfaz para que esta implementación funcione.

import Cocoa @objc public class MyWindowController: NSWindowController, NSTextFieldDelegate { @IBOutlet weak var myTextField: NSTextField! // MARK: - ViewController lifecycle - override public func windowDidLoad() { super.windowDidLoad() myTextField.delegate = self } // MARK: - NSTextFieldDelegate - public override func controlTextDidChange(_ obj: Notification) { // check the identifier to be sure you have the correct textfield if more are used if let textField = obj.object as? NSTextField, self.myTextField.identifier == textField.identifier { print("/n/nMy own textField = /(self.myTextField)/nNotification textfield = /(textField)") print("/nChanged text = /(textField.stringValue)/n") } }

}

Salida de la consola:

My own textField = Optional(<myApp.NSTextField 0x103f1e720>) Notification textfield = <myApp.NSTextField: 0x103f1e720> Changed text = asdasdasddsada