2017-09-07 2 views
0

in meinem NSViewController Ich habe ein NSTexField, das Benachrichtigungen auslöst, sobald sich sein Inhalt ändert.Swift macOS-Benachrichtigung bei textchange

Ich habe auch mehrere Schaltflächen, die IBActions definiert haben, um Zeichen in das NSTextField zu schreiben. Jedes Mal, wenn eine der Schaltflächen gedrückt wird, wird das NSTextField aktualisiert. Die Benachrichtigung wird nicht ausgelöst.

Wie kann ich ein NSControlTextDidChange-Ereignis manuell auslösen?

override func controlTextDidChange(_ notification: Notification) { 
    if let textField = notification.object as? NSTextField { 
     filterTable(with: textField.stringValue) 
    } 
} 

@IBAction func pressedKeyButton(_ sender: NSButton) { 
    let character = sender.title 
    self.searchTextField.stringValue.append(character) 
    self.searchTextField.textDidChange(Notification(name: .NSControlTextDidChange,object: nil)) 
} 
+0

Was ist "self.searchTextField.textDidChange (Mitteilung (name: .NSControlTextDidChange, Objekt: null))" für? Ihr controlTextDidChange scheint auch nicht richtig. –

+0

Wenn die pressedKeyButton-Aktion ausgelöst wird, wird der Inhalt von NSTexField aktualisiert, die controlTextDidChange-Funktion wird jedoch nicht ausgelöst. –

Antwort

1

Da dies ein Mac App ist, können Sie dies viel einfacher machen, indem Cocoa Bindungen mit dem Textfeld zu füllen. deklarieren Sie einfach eine dynamic Eigenschaft auf Ihrem View-Controller mit einem didSet Block, etwa so:

@objc dynamic var searchString: String = "" { 
    didSet { /* put notification code here */ } 
} 

Dann im Interface Builder, im Bindings-Inspektor binden die an den View-Controller Value Bindung, das Textfeld mit „Model Key Pfad "auf searchString festgelegt. Aktivieren Sie außerdem das Kontrollkästchen "Kontinuierliche Aktualisierung des Werts". In Ihrem eigenen Code, aktualisieren Sie das Textfeld durch Ändern der searchString Eigenschaft, anstatt den Zugriff auf das Textfeld direkt (man könnte sogar in der Lage sein, von dem Auslass für das Textfeld ein, um loszuwerden, wie Sie wahrscheinlich nicht brauchen mehr). Da alle Änderungen an der Zeichenfolge in dem Textfeld jetzt angezeigt wird die searchString Eigenschaft gehen, sein didSet Block wird immer dann aufgerufen werden, und Sie werden konsequent benachrichtigt.

Verwandte Themen