2012-01-15 19 views
7

W ostatniej wersji xcode próbuję uzyskać zdarzenie keyDown o NSTextField. Jednak pomimo tego, że po wielu tutorialach w Internecie (delegaci, kontrolery ...) nadal nie mogę go odebrać.Pobierz wydarzenie keyDown dla NSTextField

Jakaś łatwa wskazówka dla mnie?

Dzięki!

+0

Ze względu na działanie edytorów pól jest to nieco skomplikowane. Co tak naprawdę próbujesz zrobić? –

Odpowiedz

-2

Dodaj UITextFieldDelegate do .h jak ten

@interface ViewController : UIViewController <UITextFieldDelegate> { 

Następnie można wykorzystać do wykrywania wszelkich naciśnięcie klawisza w polu tekstowym

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

Powrót TAK, aby umożliwić charakter, który został wciśnięty do być wstawionym do pola, ale możesz tutaj dodać kod, który potrzebujesz.

+4

Twój kod jest dla iphone, a nie dla osx. – VenoMKO

+0

@Darren twój kod przechwytuje wydarzenie KeyDown – iNeo

3

Możesz podklasą NStextField i użyć keyUp, która działa dla NSTextField.

w .h

@interface MyTextField : NSTextField <NSTextFieldDelegate> 

w .m

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

Możesz po prostu użyć metody delegatów zamiast podklasy. Musisz także ustawić delegata NSTextField na właściciela pliku. To najprostszy sposób. – Kezzer

+0

To nie odpowiada na pytanie, które zwraca się do keyDown –

+0

Jamie, KeyDown to kolejna funkcja pełnomocnika. – Sebastian

10

zachorowałem wszystkich non odpowiedzi to zrobić w inny sposób ludzi tak kładę nos w dół i wymyśliliśmy sposób aby to działało. To nie korzysta bezpośrednio ze zdarzenia keydown, ale wykorzystuje klucz keydown w bloku. A zachowanie jest dokładnie tym, czego chciałem.

Podklasa pole tekstowe

.h

@interface LQRestrictedInputTextField : NSTextField 

.m

W pierwszej konfiguracji reagujących stać się lokalnym wydarzeniem

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

usunąć zdarzenie raz edycji textField kończy się

Również jeśli używasz ARC, zauważyłem, że możesz przypisać ciąg tekstowy do stringValue. I nslog'd stringValue i wartość została zachowana. Bez nslog musiałem przypisać ciąg znaków obiektu powiadomień do wartości stringValue, aby zapobiec jej zwolnieniu.

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

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