开启Full Keyboard Access时如何让自定义NSControl接收空格/制表符keyDown事件?
问题:开启Full Keyboard Access时自定义NSControl无法接收空格/制表符的
keyDown事件 我正在使用一个继承自NSControl的自定义视图类,该视图是键视图,需要处理包括空格和制表符在内的keyDown事件。
但当在「系统设置」>「辅助功能」>「键盘」中开启Full Keyboard Access后,该自定义视图无法接收空格/制表符的keyDown事件,macOS似乎会拦截这类按键事件以控制键盘焦点。

另一方面,即使开启Full Keyboard Access,NSTextView仍可按如下方式接收空格/制表符的keyDown事件:
- 从上个视图按下tab键时,键盘焦点移至NSTextView;
- 在NSTextView中未输入任何字符时按下tab键,焦点移至下一个视图;
- 在NSTextView中输入字符后按下tab键,会输入制表符;
- 在NSTextView中按下space键,会输入空格。
我希望实现与NSTextView相同的行为,但尚未找到在开启Full Keyboard Access时接收空格/制表符keyDown事件的方法。
提问
如何在开启Full Keyboard Access时接收空格/制表符的keyDown事件?
已知信息
- 已查看相关帖子,但答案仅说明如何设置键视图循环以移动键盘焦点;
- 已确认该问题在macOS 13.2.1和12.5版本中存在;
- 在旧版macOS中,「Full Keyboard Access」设置位于「系统设置」>「键盘」>「快捷键」,开启旧版设置时不会出现此问题。
测试用最简代码
CustomView.h
@interface CustomView : NSControl @end
CustomView.m
@implementation CustomView - (BOOL)acceptsFirstResponder { return YES; } - (BOOL)canBecomeKeyView { return YES; } - (void)keyDown:(NSEvent *)event { NSLog(@"keyDown"); } - (void)mouseDown:(NSEvent *)event { [[self window] makeFirstResponder:self]; } - (BOOL)isAccessibilityElement { return YES; } - (BOOL)isAccessibilityEnabled { return YES; } - (NSAccessibilityRole)accessibilityRole { return NSAccessibilityTextFieldRole; } @end
ViewController.m
@implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; [[[self view] window] makeFirstResponder:self.customView1]; } @end
测试结果
- 预期结果:自定义视图可以接收空格/制表符的
keyDown事件。 - 实际结果:自定义视图无法接收空格/制表符的
keyDown事件。
内容的提问来源于stack exchange,提问作者Daisuke K.
相关产品推荐
相关产品推荐

