我有一个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
即可对我正在寻找的事件做出反应。
我测试了这个但是我在选择器的末尾错过了一个冒号,所以我认为这不是正确的方法。这确实是正确的方法。
答案 0 :(得分:1)
您崩溃的原因是您的selector
错误。它应该是selector: "fieldTextDidChange:"
(注意最后的冒号)。