ウィンドウのテキストフィールドから「テキスト変更」イベントをキャッチする方法を理解しようとしています。私はJavaの「アクションリスナー」に慣れていて、Objective-C/Cocoaで同様のものを見つけることができません。かなり長い間検索して「キー値監視」プロトコルを見つけましたが、observeValueForKeyPath:
メソッド(関数?)は、テキストフィールドの値がコードで変更された場合にのみトリガーされます(たとえば、[textfield setStringValue:...]
を使用)。 )、入力するのではありません。
ユーザーがテキストフィールドに入力したときに値の変化を「聞く」にはどうすればよいですか?
NSTextField
インスタンスのデリゲートを設定し、デリゲートに次のメソッドを実装させることができます。
- (void)controlTextDidChange:(NSNotification *)notification {
// there was a text change in some control
}
デリゲートオブジェクトは、アプリケーションデリゲート、ウィンドウコントローラー、ビューコントローラー、またはアプリケーション内の他のオブジェクトにすることができます。デリゲートは、プログラムで設定できます。
[myTextField setDelegate:delegateObject];
または、Interface Builderで、delegate
コントロールで使用可能なNSTextField
アウトレットを介して。
同じデリゲートにフックされた複数のコントロールがある場合、-controlTextDidChange:
が各コントロールに送信されることに注意してください。つまり、同じメソッドが異なるコントロールに対して呼び出されます。テキストが変更されたコントロールに応じて異なる動作が必要な場合は、-[NSNotification object]
を使用して、通知を送信したコントロールを識別できます。
たとえば、対応するアウトレットnameField
とaddressField
を持つ2つのテキストフィールドがあり、両方のフィールドに同じデリゲートを設定した場合、次のようになります。
- (void)controlTextDidChange:(NSNotification *)notification {
// there was a text change in some control
// [notification object] points to the control that has sent
// the notification
if ([notification object] == nameField) {
// nameField has changed
}
else if ([notification object] == addressField) {
// addressField has changed
}
}
または、テキストフィールドごとに1つのデリゲートを設定することもできます。この場合、[notification object]
をテストする必要はありません。
IBから「EditingChanged」に接続して、それを処理するアクションを作成することもできます。
- (IBAction)txtField_Changed:(id)sender
{
// my textfield has been changed
}
これは私のために働きます
func textView(textView: NSTextView, shouldChangeTextInRange affectedCharRange: NSRange, replacementString: String?) -> Bool {
print("Changed!")
return true
}