// This method deals with all keydowns. Some very interesting things could be done by manipulating this method可以發現它針對某些狀況做了處理,並把event分派給自定method,諸如:
- (void)keyDown:(NSEvent *)theEvent {
// ***warning * have downshift move to indirect object
if ([[theEvent charactersIgnoringModifiers] isEqualToString:@"/"] && [self handleSlashEvent:theEvent]) return;
if (([[theEvent characters] isEqualToString:@"~"] || [[theEvent characters] isEqualToString:@"`"]) && [self handleTildeEvent:theEvent])
return;
if ([self handleBoundKey:theEvent])
return;
if ([[theEvent charactersIgnoringModifiers] isEqualToString:@" "]) { [self insertSpace:nil];
return;
}
// ***warning * have downshift move to indirect object
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"Shift Actions"] && [theEvent modifierFlags] &NSShiftKeyMask
&& ([[theEvent characters] length] >= 1)
&& [[NSCharacterSet uppercaseLetterCharacterSet] characterIsMember:[[theEvent characters] characterAtIndex:0]] && self == [self directSelector]) {
[self handleShiftedKeyEvent:theEvent];
return;
}
if ([theEvent isARepeat] && !([theEvent modifierFlags] &NSFunctionKeyMask) )
if ([self handleRepeaterEvent:theEvent]) return;
//if (VERBOSE) NSLog(@"interpret");
[self interpretKeyEvents:[NSArray arrayWithObject:theEvent]]; return;}
handleSlashEvent
handleTildeEvent
handleBoundKey
insertSpace
以及我不太了解的兩個:
handleShiftedKeyEvent
handleRepeaterEvent
最後,交給
interpretKeyEvents (這個method定義在NSResponder中)
。
補充,關於interpretKeyEvents。
這個函式的說明如下:
Discussion
This method sends the character input in eventArray to the system input manager for interpretation as text to insert or commands to perform. The input manager responds to the request by sendinginsertText:anddoCommandBySelector:messages back to the invoker of this method. Subclasses shouldn’t override this method.
See theNSInputManagerandNSTextInputclass and protocol specifications for more information on input management.
可以發現,其中NSInpitManager用灰體字,也沒有連結;而NSTextInput有。
google NSInpitManager可以找到這份文件:
NSInputManager Class Reference (Not Recommended)
想來處理input有兩種方法,其一是在NSResponder中呼叫interpretKeyEvents;
其二是在NSView打一個handleEvent:給[self inputContext]。
前者使用input manager機制,應該是歷史的產物吧!雖保留但不建議使用;後者使用input context機制,建議使用。
回歸正題。
接下來的問題是,如果不重寫keyDown,則重點在於讓input context打doCommandBySelector:回來。要如何讓input context選擇正確的selector呢?
沒有留言:
張貼留言