You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

开启Full Keyboard Access时如何让自定义NSControl接收空格/制表符keyDown事件?

问题:开启Full Keyboard Access时自定义NSControl无法接收空格/制表符的keyDown事件

我正在使用一个继承自NSControl的自定义视图类,该视图是键视图,需要处理包括空格和制表符在内的keyDown事件。

但当在「系统设置」>「辅助功能」>「键盘」中开启Full Keyboard Access后,该自定义视图无法接收空格/制表符的keyDown事件,macOS似乎会拦截这类按键事件以控制键盘焦点。

辅助功能中的Full Keyboard Access设置

另一方面,即使开启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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 12:40:00