Swift macOS 文本更改通知
Swift macOS notification on textchange
在我的 NSViewController 中,我有一个 NSTexField,它会在每次内容更改时触发通知。
我还有几个按钮,它们定义了 IBActions 以将字符写入 NSTextField。
但是,每次按下其中一个按钮时,NSTextField 都会更新。通知未触发。
如何手动触发 NSControlTextDidChange 事件?
override func controlTextDidChange(_ notification: Notification) {
if let textField = notification.object as? NSTextField {
filterTable(with: textField.stringValue)
}
}
@IBAction func pressedKeyButton(_ sender: NSButton) {
let character = sender.title
self.searchTextField.stringValue.append(character)
self.searchTextField.textDidChange(Notification(name: .NSControlTextDidChange,object: nil))
}
由于这是一个 Mac 应用程序,您可以通过使用 Cocoa 绑定来填充文本字段来简化此过程。只需在您的视图控制器上使用 didSet
块声明一个 dynamic
属性,如下所示:
@objc dynamic var searchString: String = "" {
didSet { /* put notification code here */ }
}
然后,在 Interface Builder 的绑定检查器中,将文本字段的 Value
绑定绑定到视图控制器,并将 "Model Key Path" 设置为 searchString
。另外,打开 "Continuously Updates Value" 复选框。在您自己的代码中,通过更改 searchString
属性 而不是直接访问文本字段来更新文本字段(您甚至可以摆脱文本字段的出口,因为您可能会赢不再需要它了)。由于文本字段中显示的字符串的所有更改现在都将通过 searchString
属性,它的 didSet
块将始终被调用,并且您将始终收到通知。
在我的 NSViewController 中,我有一个 NSTexField,它会在每次内容更改时触发通知。
我还有几个按钮,它们定义了 IBActions 以将字符写入 NSTextField。 但是,每次按下其中一个按钮时,NSTextField 都会更新。通知未触发。
如何手动触发 NSControlTextDidChange 事件?
override func controlTextDidChange(_ notification: Notification) {
if let textField = notification.object as? NSTextField {
filterTable(with: textField.stringValue)
}
}
@IBAction func pressedKeyButton(_ sender: NSButton) {
let character = sender.title
self.searchTextField.stringValue.append(character)
self.searchTextField.textDidChange(Notification(name: .NSControlTextDidChange,object: nil))
}
由于这是一个 Mac 应用程序,您可以通过使用 Cocoa 绑定来填充文本字段来简化此过程。只需在您的视图控制器上使用 didSet
块声明一个 dynamic
属性,如下所示:
@objc dynamic var searchString: String = "" {
didSet { /* put notification code here */ }
}
然后,在 Interface Builder 的绑定检查器中,将文本字段的 Value
绑定绑定到视图控制器,并将 "Model Key Path" 设置为 searchString
。另外,打开 "Continuously Updates Value" 复选框。在您自己的代码中,通过更改 searchString
属性 而不是直接访问文本字段来更新文本字段(您甚至可以摆脱文本字段的出口,因为您可能会赢不再需要它了)。由于文本字段中显示的字符串的所有更改现在都将通过 searchString
属性,它的 didSet
块将始终被调用,并且您将始终收到通知。