2017-01-12 3 views
1

Ich habe versucht, einen Delegaten für einen NSViewController wie diese zu registrieren:NSViewController Delegierter

class ViewController: NSViewController , NSTextFieldDelegate{ 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     textfield.delegate = self 
    } 

    override var representedObject: Any? { 
     didSet { 
     // Update the view, if already loaded. 
     } 
    } 
    @IBOutlet weak var textfield: NSTextField! 

    func textDidChange(_ notification: Notification) 
    { print ("text did change ") 
    } 
} 

des func textDidChange nicht aufgerufen wird, wenn das Textfeld seinen Inhalt ändert.

Im Storyboard habe ich die folgenden Verbindungen:

enter image description here

+0

Sind Sie sicher, dass das Textfeld mit Ihrer 'textfield' Steckdose verbunden ist? – Caleb

+0

Ich denke, ich habe es getan. Ich habe oben einen Screenshot hinzugefügt. – mica

Antwort

2

textDidChange ist nicht Teil NSTextFieldDelegate, es ist ein Teil von NSTextDelegate, und es ist in der Regel für NSTextView s, nicht NSTextField s verwendet.

NSTextFieldDelegate nimmt NSControlTextEditingDelegate, einschließlich controlTextDidChange, was Sie suchen.

override func controlTextDidChange(_ obj: Notification) { 
    print("text did change") 
} 

Beachten Sie, dass die Delegierten entweder über Storyboard-Ausgang festlegen oder über Code, aber Sie müssen nicht beides tun (ich den ehemaligen bevorzugen, aber es ist völlig subjektiv, die überlegen ist).

+0

thx, funktioniert. Ist das Delegieren des Delegaten ein Problem? – mica

+0

Nein, das Einstellen des Delegierten zweimal tut nichts weh, es ist nur unnötig. Worst Case: irgendwann in der Zukunft, Sie entscheiden, den Delegierten zu etwas anderem zu ändern, und nur daran denken, es an einem der Orte zu ändern, und anschließend stundenlang zu versuchen, herauszufinden, warum es nicht richtig funktioniert. – zpasternack