【问题标题】:Add notificationCenter observer to specific NSTextField - MacOS将 notificationCenter 观察者添加到特定的 NSTextField - MacOS
【发布时间】:2017-08-27 20:24:32
【问题描述】:

对于我使用 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 等。

【问题讨论】:

标签: swift xcode macos cocoa


【解决方案1】:

问题在于NSTextDidChangeNotificationNSText 的通知之一,而NSTextField 不继承自NSText。您看到这些通知的原因是NSTextField 使用字段编辑器,它是NSTextView 的一个实例,它NSText 的子类,来执行它的实际操作编辑,并且通知的object 属性将是字段编辑器,而不是原来的NSTextField

如果您注册以接收 NSControlTextDidChangeNotification 通知,您应该能够将文本字段指定为 object 并让它工作。

【讨论】:

    【解决方案2】:

    还有另一种方法,在您选择的 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
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多