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

标签 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 等。

最佳答案

问题是NSTextDidChangeNotificationNSText的通知之一,而NSTextField没有继承自NSText。您看到这些通知的原因是 NSTextField 使用了字段编辑器,它是 NSTextView 的一个实例, NSText 的子类,进行实际编辑,通知的 object 属性将是字段编辑器,而不是原始的 NSTextField

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

关于swift - 将 notificationCenter 观察器添加到特定的 NSTextField - MacOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45909016/

相关文章:

iphone - XCode:iOS 兼容性问题

python - 运行 fish shell 时 'unknown locale: UTF-8' 导入 (Mac OS X) 错误 'pandas'

ios - "NSInternalInconsistencyException [...] Sigh. Contentview size is zero."使用 UINavigationController 时崩溃

ios - iBeacon 接收器无法识别传输的信号

string - 在 Swift 中将字符串转换为 float

xml - 使用 XML 解析 Swift 库时,Playgrounds 崩溃并显示 "unknown error"

excel - Mac Office 2011 Excel 中的 VBA 保护密码

node.js - 如何在 macOS (mojave 10.14) 上优雅地停止 NodeJS 服务器监听器?

ios - 如何将参数传递给 NSNotificationCenter 中的选择器?

ios - 无法以编程方式更改 View 的大小