Получить событие keyDown для NSTextField - PullRequest
9 голосов
/ 15 января 2012

В последней версии xcode я пытаюсь получить событие keyDown для NSTextField.Однако, несмотря на то, что я следую нескольким учебным пособиям в Интернете (делегаты, контролеры ...), я все еще не могу их получить.

Любой легкий совет для меня?

Спасибо!

Ответы [ 3 ]

12 голосов
/ 04 февраля 2013

Мне надоели все не ответы, чтобы сделать это другим способом, поэтому я опустил нос и нашел способ сделать эту работу.Это не использует событие 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.Я nslog'd stringValue и значение было сохранено.Без nslog я должен был назначить строку объекта уведомления для stringValue, чтобы предотвратить его освобождение.

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

    NSTextView *textView=[notification object];
    self.stringValue=textView.string;
}
5 голосов
/ 15 января 2012

Вы можете создать подкласс NStextField и использовать keyUp, который работает для NSTextField.

в .ч

@interface MyTextField : NSTextField <NSTextFieldDelegate>

дюйм. М

-(void)keyUp:(NSEvent *)theEvent {
    NSLog(@"Pressed key in NStextField!");
}
0 голосов
/ 15 января 2012

Добавьте UITextFieldDelegate к вашему .h следующим образом

@interface ViewController :  UIViewController <UITextFieldDelegate> {

Затем вы можете использовать это для обнаружения каждого нажатия клавиши в текстовом поле

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

Возвратите YES, чтобы разрешить символу, которыйбыла нажата для вставки в поле, но здесь вы можете добавить любой код, который вам нужен.

...