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;
}
Ze względu na działanie edytorów pól jest to nieco skomplikowane. Co tak naprawdę próbujesz zrobić? –