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

时间:2017-08-27 20:24:33

标签: swift xcode macos cocoa

对于我使用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)
    }
}

这很好用。但现在我希望它应用于特定的NSTextField,所以我在观察者中设置了对象:

NotificationCenter.default.addObserver(self, selector: #selector(textFieldDidChange(_:)), name: Notification.Name.NSTextDidChange, object: textField)

现在突然间它不再起作用了,我似乎无法弄明白为什么。刚开始使用Xcode和Swift。我整个周末一直在寻找解决方案,但我发现大多数答案适用于iOS应用程序,旧版本的swift,Objective-C等。

2 个答案:

答案 0 :(得分:0)

问题是NSTextDidChangeNotificationNSText的通知之一,NSTextField不会从NSText继承。你完全看到这些通知的原因是因为NSTextField使用字段编辑器,它是NSTextView的一个实例,其中 NSText的子类},进行实际编辑,通知的object属性将是字段编辑器而不是原始NSTextField

如果您注册接收NSControlTextDidChangeNotification通知,则应该可以将文本字段指定为object并使其正常工作。

答案 1 :(得分:0)

还有另一种方法,仅在您选择的UITextField(和Swift 5)上使用.isEditing方法。

首先,在viewDidLoad()中声明您的观察者:

NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)

然后

@objc func keyboardWillShow(notification: NSNotification) {

        if <YOUR_UITEXTFIELD_HERE>.isEditing {
            if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
                if self.view.frame.origin.y == 0 {
                self.view.frame.origin.y -= keyboardSize.height
                }
            }
        }
    }

@objc func keyboardWillHide(notification: NSNotification) {
        if self.view.frame.origin.y != 0 {
            self.view.frame.origin.y = 0
    }