Swift 将notificationCenter观察者添加到特定NSTextField-MacOS
对于我正在使用Xcode/Swift构建的MacOS应用程序,我尝试在NSTextField中的值发生更改时(当用户键入时)调用函数。因此,我添加了一个通知中心观察员:Swift 将notificationCenter观察者添加到特定NSTextField-MacOS,swift,xcode,macos,cocoa,Swift,Xcode,Macos,Cocoa,对于我正在使用Xcode/Swift构建的MacOS应用程序,我尝试在NSTextField中的值发生更改时(当用户键入时)调用函数。因此,我添加了一个通知中心观察员: import Cocoa class ViewController: NSViewController, NSTextDelegate { @IBOutlet weak var textField: NSTextField! override func viewDidLoad() { sup
import Cocoa
class ViewController: NSViewController, NSTextDelegate {
@IBOutlet weak var textField: NSTextField!
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(textFieldDidChange(_:)), name: Notification.Name.NSTextDidChange, object: nil)
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
func textFieldDidChange(_ notification: Notification) {
print(textField.stringValue)
}
}
NotificationCenter.default.addObserver(self, selector: #selector(textFieldDidChange(_:)), name: Notification.Name.NSTextDidChange, object: textField)
这个很好用。但现在我希望它应用于特定的NSTextField,因此我在observer中设置了对象:
import Cocoa
class ViewController: NSViewController, NSTextDelegate {
@IBOutlet weak var textField: NSTextField!
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(textFieldDidChange(_:)), name: Notification.Name.NSTextDidChange, object: nil)
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
func textFieldDidChange(_ notification: Notification) {
print(textField.stringValue)
}
}
NotificationCenter.default.addObserver(self, selector: #selector(textFieldDidChange(_:)), name: Notification.Name.NSTextDidChange, object: textField)
现在它突然不起作用了,我似乎不明白为什么。刚开始使用Xcode和Swift。我整个周末都在寻找解决方案,但我找到的大多数答案都适用于iOS应用程序、swift的旧版本、Objective-C等。问题是
NSTextDidChangeNotification
是NSText
的通知之一,而NSTextField
不是从NSText
继承的。您之所以看到这些通知,是因为NSTextField
使用了字段编辑器,它是NSTextView
的一个实例,是NSText
的一个子类,用于实际编辑,通知的对象
属性将是字段编辑器,而不是原始的NSTextField
如果您注册接收
NSControlTextDidChangeNotification
通知,您应该能够将文本字段指定为对象
,并使其工作。问题是NSTextDidChangeNotification
是NSText
的通知之一,并且NSTextField
不继承自NSText
。您之所以看到这些通知,是因为NSTextField
使用了字段编辑器,它是NSTextView
的一个实例,是NSText
的一个子类,用于实际编辑,通知的对象
属性将是字段编辑器,而不是原始的NSTextField
如果您注册接收
NSControlTextDidChangeNotification
通知,您应该能够将文本字段指定为对象
,并使其正常工作。还有另一种方法,只需对所选UITextField(和Swift 5)使用.isEditing
方法即可
首先,在viewDidLoad()中声明观察者:
然后
@objc func键盘将显示(通知:NSNotification){
如果。我正在编辑{
如果让keyboardSize=(notification.userInfo?[UIResponder.KeyboardFrameBeginUserInfo]作为?NSValue)?.cgRectValue{
如果self.view.frame.origin.y==0{
self.view.frame.origin.y-=keyboardSize.height
}
}
}
}
@objc func键盘将隐藏(通知:NSNotification){
如果self.view.frame.origin.y!=0{
self.view.frame.origin.y=0
}
还有另一种方法,只需在所选UITextField(和Swift 5)上编辑.i方法
首先,在viewDidLoad()中声明观察者:
然后
@objc func键盘将显示(通知:NSNotification){
如果。我正在编辑{
如果让keyboardSize=(notification.userInfo?[UIResponder.KeyboardFrameBeginUserInfo]作为?NSValue)?.cgRectValue{
如果self.view.frame.origin.y==0{
self.view.frame.origin.y-=keyboardSize.height
}
}
}
}
@objc func键盘将隐藏(通知:NSNotification){
如果self.view.frame.origin.y!=0{
self.view.frame.origin.y=0
}