2012-01-15 14 views
7

için keyDown olayını al xcode'un son sürümünde, bir NSTextField'ın keyDown olayını almaya çalışıyorum. Ancak, internetteki birden fazla eğiticiye (delegeler, kontrolörler ...) rağmen, hala bunu alamıyorum.Bir NSTextField

Benim için herhangi bir kolay ipucu?

Teşekkürler!

+0

Saha editörleri nasıl çalıştığı için biraz karmaşıktır. Aslında ne yapmaya çalışıyorsun? –

cevap

-2

bu

@interface ViewController : UIViewController <UITextFieldDelegate> { 

gibi .h için UITextFieldDelegate ekle Sonra bastırmıştı karakteri izin vermek için bir metin alanına

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

İade EVET her anahtar basın algılamak için kullanabilir alana eklenebilir, ancak ihtiyacınız olan kodu buraya ekleyebilirsiniz.

+4

Kodunuz iphone içindir, osx için değil. – VenoMKO

+0

@Darren kodunuz KeyDown Olayı yakalar – iNeo

3

NStextField alt sınıfını ve NSTextField için çalışan keyUp tuşlarını kullanabilirsiniz. Ben aşağı burnumu koymak yüzden bunu başka yolu insanları yapmak olmayan tüm cevapların hasta var ve bir yolunu

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

Yalnızca alt sınıflar yerine temsilci yöntemini kullanabilirsiniz. Ayrıca NSTextField'ın temsilcisini Dosya'nın Sahibi olarak ayarlamanız gerekir. En azından en basit yol bu. – Kezzer

+0

Bu, keyDown –

+0

Jamie için sorulan soruya cevap vermiyor, KeyDown başka bir temsilci işlevi. – Sebastian

10

.m .h

@interface MyTextField : NSTextField <NSTextFieldDelegate> 

yılında

Bu işi yapmak için. Bu, doğrudan keydown olayı kullanmıyor, ancak bloktaki tuşlamayı kullanıyor. Ve davranış tam olarak istediğim şey.

Alt sınıf haline ilk savunan kurulumda metin alanı

.h

@interface LQRestrictedInputTextField : NSTextField 

.m

yerel bir olay

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; 
} 

textfield düzenleme kez olay çıkarmak

yazıyor

Ayrıca ARC kullanıyorsanız fark ettim ki, textview dizesini stringValue öğesine atamanız gerekebilir. StringValue değerini girdim ve değer korunur. Nslog olmadan, bildirim nesnesi dizesini yayımlanmasını engellemek için stringValue öğesine atamak zorunda kaldım.

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

    NSTextView *textView=[notification object]; 
    self.stringValue=textView.string; 
} 
İlgili konular