2012-07-14 8 views
42

Me gustaría utilizar el código de la respuesta a esta pregunta: How to observe the value of an NSTextField en un NSTextField para observar los cambios en la cadena almacenada en NSTextField.Notificación de cambio de texto para un 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 una notificación disponible en NSTextField que se pueda utilizar en este caso?

+1

Podría aclarar si usted está buscando para ser notificado cuando los cambios stringvalue del TextField, o cuando los cambios de texto seleccionados (como las ofertas de respuestas relacionadas con)? – NSGod

Respuesta

89

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

sólo tiene que conectar la salida del delegateNSTextField en el archivo de punta a su clase controlador, e implementar algo como esto:

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

Si va a crear el NSTextField mediante programación, puede utilizar NSTextField 's setDelegate: método 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 Cocoa. 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 personalizada NSTextField 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 echa un vistazo a los siguientes:

Cocoa Fundamentals Guide: Delegates and Data Sources

En cuanto a lo que significa id <NSTextFieldDelegate>: significa un objeto genérico (id) que se declara su conformidad con el protocolo <NSTextFieldDelegate>. Para obtener más información sobre los protocolos, consulte The Objective-C Programming Language: Protocols. proyecto GitHub

Muestra en: https://github.com/NSGod/MDControlTextDidChange

+0

No estoy creando NSTextField con IB, pero sí programáticamente. hay un método equivalente para esto? – alecail

+0

respuesta actualizada para creación programática – NSGod

+0

Los delegados son nuevos para mí. No sé exactamente qué es 'id ' y dónde poner el método 'controlTeidDidChange' está buscando' setDelegate' para, pero lo averiguaré pronto. – alecail

0

Creo que quiere leer en el field editor que es esencialmente un (oculto) NSTextView que maneja la entrada de texto a todos los NSTextField s en una ventana dada. La sección en "Using Delegation and Notification With the Field Editor" debe apuntarle en la dirección correcta.

+1

Vínculos rotos :(Pruebe aquí: https://developer.apple.com/library/mac/documentation/TextFonts/Conceptual/CocoaTextArchitecture/TextFieldsAndViews/TextFieldsAndViews.html – ericpeters0n

0

En Swift es

public override func controlTextDidChange(_ obj: Notification) { 


} 
0

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

Consola:

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

Changed text = asdasdasddsada 
Cuestiones relacionadas