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;
}
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ì? –