2012-01-15 11 views
7

xcodeの最新バージョンでは、NSTextFieldのkeyDownイベントを取得しようとしています。 しかし、インターネット上の複数のチュートリアル(デリゲート、コントローラ...)にもかかわらず、私はまだそれを受け取ることができません。NSTextFieldのkeyDownイベントを取得する

私には簡単なヒントはありますか?

ありがとうございます!

+0

フィールドエディタの仕組みによって、少し複雑です。実際に何をしようとしていますか? –

答えて

-2

次にあなたが押された文字を許可するように、テキストフィールド

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 

戻りYESにすべてのキーを押しを検出するためにこれを使用することができ、この

@interface ViewController : UIViewController <UITextFieldDelegate> { 

のようなあなたの.hにUITextFieldDelegateを追加フィールドに挿入することができますが、ここに必要なコードを追加できます。

+4

あなたのコードはiphone用で、osx用ではありません。 – VenoMKO

+0

@DarrenあなたのコードはKeyDownイベントをキャプチャします – iNeo

3

NStextFieldをサブクラス化して、NSTextFieldで動作するkeyUpを使用できます。私は私がダウンして私の鼻を入れて、それを他の方法の人々を行うには、すべての非回答の病気になったと方法を考え出し

-(void)keyUp:(NSEvent *)theEvent { 
    NSLog(@"Pressed key in NStextField!"); 
} 
+1

サブクラス化の代わりにデリゲートメソッドを使用できます。また、NSTextFieldのデリゲートをFile's Ownerに設定する必要があります。それは少なくとも最も簡単な方法です。 – Kezzer

+0

これは質問に答えません。これはkeyDownを要求します –

+0

Jamie、KeyDownは別の代行機能です。 – Sebastian

10

.M内の.h

@interface MyTextField : NSTextField <NSTextFieldDelegate> 

この仕事をするこれはkeydownイベントを直接使用していませんが、ブロック内のkeydownを使用しています。そして、その行動はまさに私が望んでいたものです。

サブクラスになっファーストレスポンダの設定では、テキストフィールド

の.h

@interface LQRestrictedInputTextField : NSTextField 

.M

ローカルイベント

static id eventMonitor = nil; 

- (BOOL)becomeFirstResponder { 
    BOOL okToChange = [super becomeFirstResponder]; 
    if (okToChange) { 
     [self setKeyboardFocusRingNeedsDisplayInRect: [self bounds]]; 

     if (!eventMonitor) { 
      eventMonitor = [NSEvent addLocalMonitorForEventsMatchingMask:NSKeyDownMask handler:^(NSEvent *event) { 

       NSString *characters = [event characters]; 
       unichar character = [characters characterAtIndex:0]; 
       NSString *characterString=[NSString stringWithFormat:@"%c",character]; 

       NSArray *validNonAlphaNumericArray = @[@" ",@"(",@")",@"[",@"]",@":",@";",@"\'",@"\"",@".",@"<",@">",@",",@"{",@"}",@"|",@"=",@"+",@"-",@"_",@"?",@"#", 
                @(NSDownArrowFunctionKey),@(NSUpArrowFunctionKey),@(NSLeftArrowFunctionKey),@(NSRightArrowFunctionKey)]; 

       if([[NSCharacterSet alphanumericCharacterSet] characterIsMember:character] || character == NSCarriageReturnCharacter || character == NSTabCharacter || character == NSDeleteCharacter || [validNonAlphaNumericArray containsObject:characterString ]) { //[NSCharacterSet alphanumericCharacterSet] 
       } else { 
        NSBeep(); 
        event=nil; 
       } 
       return event; 
      } ]; 

     } 
    } 
    NSLog(@"become first responder"); 
    return okToChange; 
} 

テキストフィールドの編集一度イベントを削除終了

ARCを使用している場合は、textview文字列をstringValueに割り当てる必要があるかもしれないことに気付きました。私はstringValueをnslog'dし、値は保持されました。 nslogがなければ通知オブジェクトの文字列をstringValueに割り当てて、それが解放されないようにしなければなりませんでした。

-(void) textDidEndEditing:(NSNotification *)notification { 
    [NSEvent removeMonitor:eventMonitor]; 
    eventMonitor = nil; 

    NSTextView *textView=[notification object]; 
    self.stringValue=textView.string; 
} 
関連する問題