2012-07-14 13 views
42

Ich möchte den Code aus der Antwort auf diese Frage verwenden: How to observe the value of an NSTextField auf einem NSTextField, um Änderungen an der Zeichenfolge im NSTextField zu beobachten.Textänderungsbenachrichtigung für ein NSTextField

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

Die hier verwendete Klasse ist ein NSTextView. Ich kann keine Benachrichtigung in NSTextField anstelle von NSTextViewDidChangeSelectionNotification finden.

Gibt es in NSTextField eine Benachrichtigung, die in diesem Fall verwendet werden kann?

+1

Können Sie klären, ob Sie benachrichtigt zu werden suchen, wenn die String des Textfeldes ändert, oder wenn die ausgewählten Textänderungen (wie die verknüpften Antwort befasst sich mit) – NSGod

Antwort

89

Wenn Sie nur feststellen möchten, wann sich der Wert eines Textfelds geändert hat, können Sie die controlTextDidChange: Delegatmethode verwenden, die NSTextField von NSControl erbt.

Schließen Sie einfach den delegate Ausgang der NSTextField in der nib-Datei auf Ihre Controller-Klasse, und so etwas wie dies umzusetzen:

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

Wenn Sie die NSTextField programmatisch erstellen, können Sie NSTextField ‚s verwenden setDelegate: Methode nach der Erstellung, um den Delegaten anzugeben:

Delegierung ist eines der grundlegenden Entwurfsmuster, die in ganz Cocoa verwendet werden. Kurz gesagt, ermöglicht es Ihnen, das Verhalten von Standardobjekten (in diesem Fall Benutzeroberflächenobjekte) ohne die Komplexität, die mit der Unterklasse des Objekts einhergeht, um dieses zusätzliche Verhalten hinzuzufügen, einfach anzupassen. Eine andere Möglichkeit auf niedrigerer Ebene, zu erkennen, wenn sich der Text in einem Textfeld geändert hat, könnte beispielsweise darin bestehen, Ihre eigene benutzerdefinierte NSTextField Unterklasse zu erstellen, in der Sie die keyDown:-Methode überschreiben, die NSTextField von NSResponder erbt. Eine solche Unterklassenbildung ist jedoch schwierig, da Sie eine genaue Kenntnis der Vererbungshierarchie des Objekts benötigen. Für mehr Informationen, auf jeden Fall überprüfen Sie folgendermaßen vor:

Cocoa Fundamentals Guide: Delegates and Data Sources

In Bezug auf was id <NSTextFieldDelegate> bedeutet: es bedeutet, ein generisches Objekt (id), der sich als konform mit dem <NSTextFieldDelegate> Protokoll erklärt. Weitere Informationen zu Protokollen finden Sie unter The Objective-C Programming Language: Protocols.

Probe GitHub Projekt: https://github.com/NSGod/MDControlTextDidChange

+0

Ich erstelle das NSTextField nicht mit IB, sondern programmatisch gibt es eine entsprechende Methode dafür? – alecail

+0

aktualisierte Antwort für die programmatische Erstellung – NSGod

+0

Delegaten sind neu für mich.Ich weiß nicht genau, was eine 'id ' ist und wo die 'controlTextDidChange' Methode die' setDelegate' suchen für, aber ich werde bald herausfinden .. – alecail

0

Ich glaube, Sie möchten auf der field editor lesen, die im Wesentlichen eine (versteckte) NSTextView, die die Texteingabe zu allen NSTextField s in einem bestimmten Fenster behandelt. Der Abschnitt "Using Delegation and Notification With the Field Editor" sollte Sie in die richtige Richtung weisen.

+1

Defekte Links :(Versuchen Sie es hier: https://developer.apple.com/library/mac/documentation/TextFonts/Conceptual/CocoaTextArchitecture/TextFieldsAndViews/TextFieldsAndViews.html – ericpeters0n

0

In Swift ist es

public override func controlTextDidChange(_ obj: Notification) { 


} 
0

Xcode 9.2. mit Swift 4.0.3.

Das NSTextField muss über den Schnittstellen-Builder verbunden sein, damit diese Implementierung funktioniert.

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") 
    } 
} 

}

Console Ausgabe:

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

Changed text = asdasdasddsada