12

テキストフィールドでEnterキーが押されたときにアクション(またはボタン)をトリガーする方法の簡単な例を探していました。

テキストフィールドをサブクラス化する必要がありますか?必要なアクションを呼び出すために代理人を設定する必要がありますか?メインウィンドウコントローラークラスでイベントをキャッチする方法はありますか?

もしあなたが私を正しい方向に向けることさえできれば、それは素晴らしいことです。ありがとう。

4

5 に答える 5

22

承認された回答へのコメントで参照されているサイトは、ウェブホストによって「一時停止」になりました。Googleキャッシュには、重要なステップを含むスクリーンショットがありません。

だから、これが私が見つけた代替ソリューションです:

  1. 完璧に動作します
  2. サブクラス化は必要ありません

一部のキー(Enter、Delete、Backspaceなど)の場合、Appleは通常のcontrolTextDidEndEditing:などのメソッドを呼び出しません。代わりに、Appleはマジックキーごとに個別のセレクターを実行しますが、それを傍受するために使用できる方法があります。

Appleの公式ドキュメントはこちら:

https://developer.apple.com/library/mac/documentation/TextFonts/Conceptual/CocoaTextArchitecture/TextEditing/TextEditing.html#//apple_ref/doc/uid/TP40009459-CH3-SW31

...しかし、それが消える/移動する場合は、このメソッドをデリゲートに追加します。

- (BOOL)control:(NSControl *)control textView:(NSTextView *)fieldEditor doCommandBySelector:(SEL)commandSelector
{           
    BOOL retval = NO;

    if (commandSelector == @selector(insertNewline:)) {

        retval = YES; // causes Apple to NOT fire the default enter action

        // Do your special handling of the "enter" key here

    }

    NSLog(@"Selector = %@", NSStringFromSelector( commandSelector ) );

    return retval;  
}

私の場合、バックスペースキーもオーバーライドしたかったのですが、このメソッドでアプリを実行すると、セレクターが「deleteBackward:」であるという出力が得られたので、それに反応するために別のifステートメントを追加しました。

于 2011-05-16T11:10:31.420 に答える
9

Enterキーを押した後にアクションを取得するには、ウィンドウコントローラにIBActionを記述し、テキストフィールドに接続します。より多くのようにしたい場合は、テキストフィールドにフォーカスしてテキストフィールドを離れるときにメソッドを呼び出す必要があります。デリゲートを設定する必要があります(ここを参照)。

于 2010-04-14T11:25:04.340 に答える
2

コントローラクラスのIBActionをテキストフィールドに接続するだけです。このアクションは、Enterキーを押すか、TabキーまたはMouseキーを押しながらテキストフィールドを離れたときに呼び出す必要があります。

于 2010-04-14T10:12:32.053 に答える
1

好奇心旺盛な方のために、実装方法は次のとおり-controlTextDidEndEditing:(NSNotification)objです(Enterキーだけに応答する必要がない場合)

AppDelegate.h:

// Conform to the protocol to avoid compiler warnings
@interface myClass : NSObject <NSTextFieldDelegate>

// Link up to the interface elements you want to trigger
@property (weak) IBOutlet NSTextField *myTextField;
@property (weak) IBOutlet NSButton *myButton;

// Create an action linked to myButton
- (IBAction)myButtonPressed:(id)sender;

// Advertise that you implement the method
- (void)controlTextDidEndEditing:(NSNotification *)obj;

AppDelegate.m:

@synthesize myTextField = _myTextField;
@synthesize myButton = _myButton;

// Make yourself the delegate
- (void)applicationDidFinishLoading:(NSNotification *)aMessage {
    _myTextField.delegate = self;
}

// NSTextField objects send an NSNotification to a delegate if
// it implements this method:

- (void)controlTextDidEndEditing:(NSNotification *)obj {
    if ([[obj object] isEqual:_textField]) {
        [self myButtonPressed:nil]; // nil = sender
    }
}

私にとって魅力のように働いた。

于 2013-01-21T12:01:49.530 に答える
1

作成済みのアクションを使用するのが最善の方法control + dragであるため、を押すreturnとアクションもトリガーされます。

于 2014-08-03T17:32:00.023 に答える