簡體   English   中英

將通知中心觀察者添加到特定的 NSTextField - MacOS

[英]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 等。

問題是NSTextDidChangeNotificationNSText的通知之一,而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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM