.m .h
@interface MyTextField : NSTextField <NSTextFieldDelegate>
yılında
Bu işi yapmak için. Bu, doğrudan keydown olayı kullanmıyor, ancak bloktaki tuşlamayı kullanıyor. Ve davranış tam olarak istediğim şey.
Alt sınıf haline ilk savunan kurulumda metin alanı
.h
@interface LQRestrictedInputTextField : NSTextField
.m
yerel bir olay
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;
}
textfield düzenleme kez olay çıkarmak
yazıyor
Ayrıca ARC kullanıyorsanız fark ettim ki, textview dizesini stringValue öğesine atamanız gerekebilir. StringValue değerini girdim ve değer korunur. Nslog olmadan, bildirim nesnesi dizesini yayımlanmasını engellemek için stringValue öğesine atamak zorunda kaldım.
-(void) textDidEndEditing:(NSNotification *)notification {
[NSEvent removeMonitor:eventMonitor];
eventMonitor = nil;
NSTextView *textView=[notification object];
self.stringValue=textView.string;
}
Saha editörleri nasıl çalıştığı için biraz karmaşıktır. Aslında ne yapmaya çalışıyorsun? –