通知中心观察员检查NSTextView无法正常工作

时间:2017-11-21 22:40:00

标签: swift macos cocoa

我使用通知中心观察员检查NSTextView

NotificationCenter.default.addObserver(self, selector:  #selector(testest), name: NSTextView.didEndEditingNotification, object: nil)

它有效,但问题是,我有两个nstextview并且它自动接收一个

即使我在obejct中指定了它的名字?那是为什么?

像这样

  NotificationCenter.default.addObserver(self, selector: #selector(testest), name: NSTextView.didEndEditingNotification, object: BoxText)

更新:它在我的两个NSTextViews上都会选择如何指定一个?

1 个答案:

答案 0 :(得分:0)

如果您传递nil,视图控制器中的所有NSTextView都将收到通知。只需为每个NSTextView创建一个IBOutlet,将通知对象强制转换为NSTextView,并检查它是否与每个NSTextView相等。如果您希望只为某个文本视图触发选择器,则需要将其作为对象参数传递:

import Cocoa

class ViewController: NSViewController {

    @IBOutlet var textViewLeft: NSTextView!
    @IBOutlet var textViewRight: NSTextView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // If you pass nil all NSTextView in your view controller will receive the notification
        NotificationCenter.default.addObserver(self, selector: #selector(didEndEditing), name:  NSTextView.didEndEditingNotification, object: nil)
        // If you would like to have a selector to fire just for a certain text view you need to pass it as the object parameter
        NotificationCenter.default.addObserver(self, selector: #selector(didEndEditingTextViewLeft), name:  NSTextView.didEndEditingNotification, object: textViewLeft)
        NotificationCenter.default.addObserver(self, selector: #selector(didEndEditingTextViewRight), name:  NSTextView.didEndEditingNotification, object: textViewRight)

    }

    @objc func didEndEditing(_ obj: Notification) {
        if (obj.object as? NSTextView) == textViewLeft {
            print(#function, "textViewLeft")
        } else if (obj.object as? NSTextView) == textViewRight {
            print(#function,"textViewRight")
        }
    }

    @objc func didEndEditingTextViewLeft(_ obj: Notification) {
        print(#function)
    }

    @objc func didEndEditingTextViewRight(_ obj: Notification) {
        print(#function)
    }
}