如果我有两个文本视图,如何检查NSTextView何时更改?

时间:2017-12-10 02:54:29

标签: swift macos delegates nstextview

在带有两个NSTextView的macOS应用程序中,我试图检查textView何时更改,到目前为止我已经这样做了:

class ViewController: NSViewController, NSTextViewDelegate {

    @IBOutlet var mainTextField: NSTextView!
    @IBOutlet var findPanelFindTextView: NSTextView!

    func textDidChange(_ notification: Notification) {
            print("Hello!") // works only with mainTextField
        }


    override func viewDidLoad() {
        super.viewDidLoad()
        mainTextField.delegate = self // for textDidChange
        findPanelFindTextField.delegate = self // for textDidChange
    }

}

只有第一个NSTextView(mainTextField)触发方法textDidChange。

我已经看到了这个问题Check if NSTextView has been edited,该实现适用于我的第一个textView,但不适用于我的第二个textView。

1 个答案:

答案 0 :(得分:3)

除了你编写了findPanelFindTextField但它应该是findPanelFindTextView之外,你应该检查发布通知的对象,从中创建一个textView对象,然后将其从Any转换为NSTextView,然后创建用于检查哪个textview正在发布通知的开关:

@IBOutlet var mainTextView: NSTextView!
@IBOutlet var findPanelFindTextView: NSTextView!

override func viewDidLoad() {
    super.viewDidLoad()
    mainTextView.delegate = self
    findPanelFindTextView.delegate = self
}

func textDidChange(_ notification: Notification) {
    guard let textView = notification.object as? NSTextView else { return }
    switch textView {
    case mainTextView:
        print("mainTextView changed")
    case findPanelFindTextView:
        print("findPanelFindTextView changed")
    default:
        break
    }
}