Swift NSViewController委托

Swift NSViewController委托,swift,cocoa,nstextfield,Swift,Cocoa,Nstextfield,我尝试为NSViewController注册代理,如下所示: class ViewController: NSViewController , NSTextFieldDelegate{ override func viewDidLoad() { super.viewDidLoad() textfield.delegate = self } override var representedObject: Any? { d

我尝试为NSViewController注册代理,如下所示:

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 ")
    }
}
如果文本字段更改其内容,则不会调用func textdichange

在故事板中,我进行了以下连接:


textdichange
不是
NSTextFieldDelegate
的一部分,它是
NSTextDelegate
的一部分,通常用于
NSTextView
s,而不是
NSTextField
s

NSTextFieldDelegate
采用
NSControlTextEditingDelegate
,包括
controlTextDidChange
,这正是您需要的

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

请注意,您可以通过故事板插座或代码来设置代理,但不需要同时进行设置(我更喜欢前者,但这完全是主观的,更为优越)。

您确定文本字段连接到您的
文本字段
插座吗?我想是的。我在上面添加了一个屏幕截图。不,设置两次代理不会有任何影响,只是没有必要。最糟糕的情况是:在将来的某个时候,您决定将委托更改为其他内容,只记得在其中一个位置更改它,然后花几个小时试图找出它不正常工作的原因。