2012-01-15 8 views
7

Trong phiên bản xcode cuối cùng, tôi đang cố gắng lấy sự kiện keyDown của một NSTextField. Tuy nhiên, mặc dù sau nhiều hướng dẫn trên internet (đại biểu, bộ điều khiển ...), tôi vẫn không thể nhận được.Lấy khóa Sự kiện đã biết cho một NSTextField

Bất kỳ gợi ý dễ dàng nào cho tôi?

Cảm ơn!

+0

Do cách trình chỉnh sửa trường hoạt động, phức tạp một chút. Bạn đang thực sự cố gắng làm gì? –

Trả lời

-2

Thêm UITextFieldDelegate đến h bạn như thế này

@interface ViewController : UIViewController <UITextFieldDelegate> { 

Sau đó, bạn có thể sử dụng để phát hiện tất cả các phím bấm trong một lĩnh vực văn bản

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

Return YES để cho phép các nhân vật đã được ép để được chèn vào trường nhưng bạn có thể thêm bất kỳ mã nào bạn cần ở đây.

+4

Mã của bạn dành cho iphone, không dành cho osx. – VenoMKO

+0

@ Darren mã của bạn không nắm bắt sự kiện KeyDown – iNeo

3

Bạn có thể phân lớp NStextField và sử dụng keyUp hoạt động cho NSTextField.

trong .h

@interface MyTextField : NSTextField <NSTextFieldDelegate> 

trong .m

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

Bạn chỉ có thể sử dụng phương thức ủy nhiệm thay vì phân lớp phụ. Bạn cũng cần đặt đại biểu của NSTextField cho Chủ sở hữu tệp. Đó là cách đơn giản nhất, ít nhất. – Kezzer

+0

Điều này không trả lời câu hỏi, yêu cầu keyDown –

+0

Jamie, KeyDown là một hàm đại biểu khác. – Sebastian

10

tôi bị ốm của tất cả các câu trả lời không làm điều đó một số người cách nào khác vì vậy tôi đặt mũi của tôi xuống và đã tìm ra một cách để thực hiện công việc này. Điều này không trực tiếp sử dụng sự kiện keydown nhưng nó đang sử dụng keydown trong khối. Và hành vi là chính xác những gì tôi muốn.

Subclass trường văn bản

.h

@interface LQRestrictedInputTextField : NSTextField 

.m

Trong thiết lập trả lời đầu tiên trở thành một sự kiện địa phương

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

loại bỏ các sự kiện một lần chỉnh sửa textfield kết thúc

Ngoài ra nếu bạn đang sử dụng ARC tôi nhận thấy bạn có thể cần phải gán chuỗi xem văn bản cho chuỗiValue. Tôi nslog'd stringValue và giá trị được giữ lại. Nếu không có nslog, tôi đã phải gán chuỗi đối tượng thông báo cho chuỗiValue để giữ nó khỏi bị loại bỏ.

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

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