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?
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
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
En Swift c'est
public override func controlTextDidChange(_ obj: Notification) {
}
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 NSTextField
s 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.
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)
}
}