NSTextView に文字が入力されるたびに変更を検出する
Cocoa プログラミング
NSTextView に何か文字が入力される度に検出して、そのタイミングで任意の処理を行う方法を調べてみました。
OS X の NSTextView
で、文字が入力されてテキストの内容が変化するたびに、それを検出して何らかの処理を行えるようにしてみます。
そのためには NSTextViewDelegate
が継承している NSTextDelegate
を使います。
NSTextViewDelegate に対応させる
今回は ViewController
で NSTextView
の変更を検出しようと思うので、まずはこのクラスに NSTextViewDelegate
を適用します。
extension ViewController : NSTextViewDelegate {
func textDidChange(notification: NSNotification) {
// ここで変更された NSTextView を受け取れます。
let textView = notification.object as! NSTextView
}
}
そして、こうして textDidChange
を実装して、テキストが変更されたときに実行する処理を記載します。
NSTextView にデリゲートを設定して準備完了
そうしたら先ほど NSTextViewDelegate
を適用したクラスを、目的の NSTextView
の delegateプロパティ
に設定します。
これで NSTextView
の内容が変更されるたびに delegate
で指定したインスタンスの textDidChange
メソッドが呼び出されるようになりました。
複数の NSTextView を扱う場合
複数の NSTextView
の delegate
に同じインスタンスが設定されている場合、そのうちのどのオブジェクトが変更されても同じ textDidChange
メソッドが呼び出されるので注意が必要です。
そのような場合は次のようにして、どのオブジェクトの変更が検出されたかを判定してから処理する必要があるかもしれません。
func textDidChange(notification: NSNotification) {
switch notification.object {
case let textView as NSTextView where textView === self.targetTextView1:
// Do Something
case let textView as NSTextView where textView === self.targetTextView2:
// Do Something
default:
fatalError()
}
}