Для нетекстовых элементов управления вы должны иметь возможность обходиться чем-то вроде этого где-то в цепочке респондента (например, ваш NSWindowController):
- (void)keyDown:(NSEvent *)event {
NSWindow *window = [self window];
switch ([[event characters] objectAtIndex:0]) {
case NSUpArrowFunctionKey:
[window makeFirstResponder:[[window firstResponder] previousValidKeyView]];
break;
case NSDownArrowFunctionKey:
[window makeFirstResponder:[[window firstResponder] nextValidKeyView]];
break;
default:
[super keyDown:event];
break;
}
}
А в текстовом поле делегаты:
- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)command {
NSWindow *window = [control window];
if (command == @selector(moveUp:)) {
[window makeFirstResponder:[[window firstResponder] previousValidKeyView]];
return YES;
} else if (command == @selector(moveDown:)) {
[window makeFirstResponder:[[window firstResponder] nextValidKeyView]];
return YES;
}
return NO;
}
(Есть аналогичный метод для делегатов текстового представления.)