web-dev-qa-db-ja.com

テキストフィールドの値の変更を聞く

ウィンドウのテキストフィールドから「テキスト変更」イベントをキャッチする方法を理解しようとしています。私はJavaの「アクションリスナー」に慣れていて、Objective-C/Cocoaで同様のものを見つけることができません。かなり長い間検索して「キー値監視」プロトコルを見つけましたが、observeValueForKeyPath:メソッド(関数?)は、テキストフィールドの値がコードで変更された場合にのみトリガーされます(たとえば、[textfield setStringValue:...]を使用)。 )、入力するのではありません。

ユーザーがテキストフィールドに入力したときに値の変化を「聞く」にはどうすればよいですか?

16
Eike Cochu

NSTextFieldインスタンスのデリゲートを設定し、デリゲートに次のメソッドを実装させることができます。

- (void)controlTextDidChange:(NSNotification *)notification {
    // there was a text change in some control
}

デリゲートオブジェクトは、アプリケーションデリゲート、ウィンドウコントローラー、ビューコントローラー、またはアプリケーション内の他のオブジェクトにすることができます。デリゲートは、プログラムで設定できます。

[myTextField setDelegate:delegateObject];

または、Interface Builderで、delegateコントロールで使用可能なNSTextFieldアウトレットを介して。

同じデリゲートにフックされた複数のコントロールがある場合、-controlTextDidChange:が各コントロールに送信されることに注意してください。つまり、同じメソッドが異なるコントロールに対して呼び出されます。テキストが変更されたコントロールに応じて異なる動作が必要な場合は、-[NSNotification object]を使用して、通知を送信したコントロールを識別できます。

たとえば、対応するアウトレットnameFieldaddressFieldを持つ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]をテストする必要はありません。

36
user557219

IBから「EditingChanged」に接続して、それを処理するアクションを作成することもできます。

- (IBAction)txtField_Changed:(id)sender
{
   // my textfield has been changed
}
3
Oren

これは私のために働きます

func textView(textView: NSTextView, shouldChangeTextInRange affectedCharRange: NSRange, replacementString: String?) -> Bool {
    print("Changed!")
    return true
}
0
Philipp