[英]Add notificationCenter observer to specific NSTextField - MacOS
對於我使用 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 等。
問題是NSTextDidChangeNotification
是NSText
的通知之一,而NSTextField
不是從NSText
繼承的。 你看到這些通知的原因是因為NSTextField
使用字段編輯器,它是NSTextView
一個實例,它是NSText
的子類,進行實際編輯,並且通知的object
屬性將是字段編輯器而不是比原來的NSTextField
。
如果您注冊接收NSControlTextDidChangeNotification
通知,您應該能夠將文本字段指定為object
並使其工作。
還有另一種方法,在您選擇的 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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.