56

この質問への回答のコードを使用したいと思います: NSTextField に格納されている文字列の変更を観察するために、NSTextField でNSTextField の値を観察する方法。

[[NSNotificationCenter defaultCenter]
    addObserverForName:NSTextViewDidChangeSelectionNotification
    object:self.textView 
    queue:[NSOperationQueue mainQueue] 
    usingBlock:^(NSNotification *note){
    NSLog(@"Text: %@", self.textView.textStorage.string);
}];

ここで使用されるクラスは NSTextView です。NSTextViewDidChangeSelectionNotification の代わりに使用する NSTextField の通知が見つかりません。

この場合に使用できる NSTextField で利用可能な通知はありますか?

4

5 に答える 5

113

テキストフィールドの値がいつ変更されたかを検出したいだけの場合は、から継承するcontrolTextDidChange:デリゲートメソッドを使用できます。NSTextFieldNSControl

nibファイルののdelegateアウトレットをコントローラークラスに接続し、次のようなものを実装するだけです。NSTextField

- (void)controlTextDidChange:(NSNotification *)notification {
    NSTextField *textField = [notification object];
    NSLog(@"controlTextDidChange: stringValue == %@", [textField stringValue]);
}

NSTextFieldプログラムで作成している場合は、作成後にNSTextFieldsetDelegate:メソッドを使用して、デリゲートを指定できます。

NSTextField *textField = [[[NSTextField alloc] initWithFrame:someRect] autorelease];
[textField setDelegate:self]; // or whatever object you want

委任は、Cocoa全体で使用される基本的なデザインパターンの1つです。簡単に言うと、標準オブジェクト(この場合はユーザーインターフェイスオブジェクト)の動作を簡単にカスタマイズできます。オブジェクトをサブクラス化して追加の動作を追加する必要はありません。たとえば、テキストフィールドのテキストが変更されたことを検出する別の下位レベルの方法は、から継承するメソッドをNSTextFieldオーバーライドする独自のカスタムサブクラスを作成することです。ただし、そのようなサブクラス化は、オブジェクトの継承階層についての深い知識が必要になる可能性があるため、困難です。詳細については、必ず以下を確認してください。keyDown:NSTextFieldNSResponder

Cocoa Fundamentals Guide:デリゲートとデータソース

id <NSTextFieldDelegate>意味について:プロトコルidに準拠していることを宣言する汎用オブジェクト()を意味します。<NSTextFieldDelegate>プロトコルの詳細については、「Objective-Cプログラミング言語:プロトコル」を参照してください。

サンプルのGitHubプロジェクト:https ://github.com/NSGod/MDControlTextDidChange

于 2012-07-15T01:09:29.603 に答える
0

特定のウィンドウ内のすべての へのテキスト入力を処理する (非表示の)フィールド エディターについてお読みになりたいと思います。「フィールド エディタで委任と通知を使用する」のセクションは、正しい方向を示しているはずです。NSTextViewNSTextField

于 2012-07-14T22:36:37.000 に答える