在带有两个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。
答案 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
}
}