web-dev-qa-db-fra.com

Notification de modification de texte pour un NSTextField

Je voudrais utiliser le code de la réponse à cette question: Comment observer la valeur d'un NSTextField sur un NSTextField afin d'observer les modifications apportées à la chaîne stockée dans le NSTextField.

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

La classe utilisée ici est une NSTextView. Je ne trouve pas de notification dans NSTextField à utiliser à la place de NSTextViewDidChangeSelectionNotification.

Existe-t-il une notification disponible dans NSTextField qui peut être utilisée dans ce cas?

48
alecail

Si vous souhaitez simplement détecter le moment où la valeur d'un champ de texte a changé, vous pouvez utiliser la méthode controlTextDidChange: delegate que NSTextField hérite de NSControl.

Connectez simplement la sortie delegate de la NSTextField dans le fichier nib à votre classe de contrôleur, et implémentez quelque chose comme ceci:

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

Si vous créez la NSTextField par programme, vous pouvez utiliser la méthode NSTextField ' setDelegate: après création pour spécifier le délégué:

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

La délégation est l'un des modèles de conception fondamentaux utilisés dans tout le cacao. En bref, cela vous permet de personnaliser facilement le comportement des objets standard (dans ce cas, des objets d'interface utilisateur) sans la complexité impliquée par l'obligation de sous-classer l'objet pour ajouter ce comportement supplémentaire. Par exemple, une autre méthode de niveau inférieur permettant de détecter le changement de texte dans un champ de texte consiste à créer votre propre sous-classe NSTextField personnalisée dans laquelle vous substituez la méthode keyDown: dont NSTextField hérite de NSResponder. Cependant, ce type de sous-classification est difficile car il peut nécessiter une connaissance intime de la hiérarchie d'héritage de l'objet. Pour plus d'informations, consultez les informations suivantes:

Guide des principes fondamentaux du cacao: délégués et sources de données

À propos de ce que id <NSTextFieldDelegate> signifie: cela signifie un objet générique (id) qui se déclare conforme au protocole <NSTextFieldDelegate>. Pour plus d'informations sur les protocoles, voir Le langage de programmation Objective-C: Protocoles .

Exemple de projet GitHub à: https://github.com/NSGod/MDControlTextDidChange

101
NSGod

Xcode 9.2. avec Swift 4.0.3.

Le NSTextField doit être connecté via le constructeur d'interface pour que cette implémentation fonctionne.

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

}

Sortie de la console:

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

Changed text = asdasdasddsada
6
Darkwonder

En Swift c'est

public override func controlTextDidChange(_ obj: Notification) {


}
0
Mark Bridges

Je crois que vous voulez lire sur l’éditeur field qui est essentiellement une (cachée) NSTextView qui gère la saisie de texte de toutes les NSTextFields d’une fenêtre donnée. La section "Utilisation de la délégation et de la notification avec l'éditeur de champs" devrait vous orienter dans la bonne direction.

0
Sean

Vous devez utiliser NSTextFieldDelegate et implémenter controlTextDidChange. Test sous macOS 10.14 et Swift 4.2

import Cocoa

class ViewController: NSViewController, NSTextFieldDelegate {

  @IBOutlet weak var textField: NSTextField!

  override func viewDidLoad() {
    super.viewDidLoad()

    textField.delegate = self
  }

  func controlTextDidChange(_ obj: Notification) {
    let textField = obj.object as! NSTextField
    print(textField.stringValue)
  }
}
0
onmyway133