Swift 中的 NSTextField 中的文本更改时执行回调

Execute callback when text changes inside a NSTextField in Swift

我有一个 NSTextField,我想在其中的文本发生变化时执行回调。回调将启用表单底部禁用的 "save" 按钮。

到目前为止我设法做的是 sub-class NSTextView 以覆盖 textDidChange(notification)

import Cocoa

class MyTextField: NSTextField {

    override func textDidChange(notification: NSNotification) {
        super.textDidChange(notification)
    }

}

在那之后,我没能在我的 ViewController 中执行一个函数。我尝试使用 NSNotificationCenter 来触发某种我可以在 ViewController 中捕获的全局事件,如下所示:

//MyTextField.swift

import Cocoa

class MyTextField: NSTextField {

    override func textDidChange(notification: NSNotification) {
        NSNotificationCenter.defaultCenter().postNotification(notification)
        super.textDidChange(notification)
    }

}


//ViewController.swift

import Cocoa

class ViewController: NSViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        NSNotificationCenter.defaultCenter().addObserver(self, selector: "fieldTextDidChange:", name: "NSTextDidChangeNotification", object: nil)
    }
    override func viewDidAppear() {
        super.viewDidAppear()
    }

    func fieldTextDidChange(notification: NSNotification) {
        print(notification, appendNewline: true)
    }
}

但是在字段中输入时出现运行时错误:Thread 1: EXC_BAD_ACCESS (code=2, address=0x7fff5f3fff70) 在调用 postNotification()

的行中

如何在 NSTextField 的文本更改时触发回调?

编辑

Sub-class发送通知是愚蠢的,正如 matt 所指出的。无需子 class 文本字段。只需观察 NSTextDidChangeNotification 就足以对我正在寻找的事件做出反应。 我已经对此进行了测试,但在此之上的选择器末尾缺少一个冒号,因此我认为这不是正确的方法。确实是正确的方法。

您崩溃的原因是您的 selector 错误。它应该是 selector: "fieldTextDidChange:"(注意最后一个冒号)。