NSTextView に文字が入力されるたびに変更を検出する

Cocoa プログラミング

NSTextView に何か文字が入力される度に検出して、そのタイミングで任意の処理を行う方法を調べてみました。


OS X の NSTextView で、文字が入力されてテキストの内容が変化するたびに、それを検出して何らかの処理を行えるようにしてみます。

そのためには NSTextViewDelegate が継承している NSTextDelegate を使います。

NSTextViewDelegate に対応させる

今回は ViewControllerNSTextView の変更を検出しようと思うので、まずはこのクラスに NSTextViewDelegate を適用します。

extension ViewController : NSTextViewDelegate {

	func textDidChange(notification: NSNotification) {

		// ここで変更された NSTextView を受け取れます。
		let textView = notification.object as! NSTextView
		
	}
}

そして、こうして textDidChange を実装して、テキストが変更されたときに実行する処理を記載します。

NSTextView にデリゲートを設定して準備完了

そうしたら先ほど NSTextViewDelegate を適用したクラスを、目的の NSTextViewdelegateプロパティ に設定します。

これで NSTextView の内容が変更されるたびに delegate で指定したインスタンスの textDidChange メソッドが呼び出されるようになりました。

複数の NSTextView を扱う場合

複数の NSTextViewdelegate  に同じインスタンスが設定されている場合、そのうちのどのオブジェクトが変更されても同じ 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()
	}
}