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

时间:2015-09-03 13:24:27

标签: macos swift cocoa nstextfield

我有一个NSTextField,我想在它内部的文本发生变化时执行回调。回调将是在表单底部启用禁用的“保存”按钮。

到目前为止我设法做的是子类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文本更改的回调?

修改

如亚光所指出的那样,分类和发送通知很愚蠢。无需对文本字段进行子类化。只需观察NSTextDidChangeNotification即可对我正在寻找的事件做出反应。 我测试了这个但是我在选择器的末尾错过了一个冒号,所以我认为这不是正确的方法。这确实是正确的方法。

1 个答案:

答案 0 :(得分:1)

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