Swift 将notificationCenter观察者添加到特定NSTextField-MacOS

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

对于我正在使用Xcode/Swift构建的MacOS应用程序,我尝试在NSTextField中的值发生更改时(当用户键入时)调用函数。因此,我添加了一个通知中心观察员:

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
}