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?
Creo que desea leer en el editor de campo que es esencialmente un NSTextView
(oculto) que maneja la entrada de texto a todos los NSTextField
s en una ventana determinada. La sección sobre "Usar Delegación y Notificación con el Editor de Campo" debe indicarle la dirección correcta.
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