objective-c - 使用键盘控制 NSSegmentedControl

标签 objective-c cocoa nsresponder nssegmentedcontrol

我的 Cocoa 应用程序中有一个表单,其中包含一个 NSSegmentedControl,我希望可以通过键盘控制它。然而,NSSegmentedControl 似乎很不愿意成为第一响应者。

将窗口的初始第一响应者设置为分段控件不会执行任何操作 - 首次加载窗口时它不会获得键盘焦点。但是,如果我像这样手动设置第一响应者,它确实会获得焦点:

[segmentedControl.window makeFirstResponder:segmentedControl];

如果表单的唯一部分是分段控件,则效果很好。如果我添加另一个字段(例如 NSTextField),并将分段控件的 nextResponder 设置为该字段,则分段控件将永远不会成为第一响应者。焦点将立即转到文本字段,按 Tab 键切换回分段控件不起作用。

我尝试子类化 NSSegmentedControl 并覆盖 AcceptFirstResponder、becomeFirstResponder 等,但无济于事。唯一有区别的是 resignFirstResponder ——如果我从该方法返回 NO,那么分段控件确实会保留焦点,但显然我不希望它始终保留焦点。

关于如何让控件表现得像正常响应者有什么想法吗?

最佳答案

它的行为符合预期。并非所有控件都参与“关键 View 循环”。完整的键盘导航是通过系统偏好设置中的通用访问为所有应用程序打开的,并且单个应用程序不能自行实现。

最好不要在用于大量键盘输入的表单中使用分段控件。 NSPopUpButton 的工作方式更接近我们对 Web 表单的期望,因此它不一定是应用 UI 中的错误选择。

与其准确地回答您提出的问题(其他人可以这样做),我谦虚地建议您选择功能方面,但代价是稍微漂亮的 UI 元素,因为更漂亮的 UI 元素并不是为了相处用键盘。

关于objective-c - 使用键盘控制 NSSegmentedControl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10778402/

相关文章:

ios - 如何将 UIGestureRecognizerDelegate 分配给 CKComponentController

objective-c - UPX 能够打包 Dylibs 吗?

cocoa - 如何将普通控件放入 NSView 中?

swift - AppleScript(或 OSA)的功能是 Cocoa 的子集吗

objective-c - 在 Swift 中如何配置 AutoreleasingUnsafeMutablePointer?

objective-c - 如何将 Objective-C 字符串转换为 C 字符串?

objective-c - 右键单击 OSX 新项目

objective-c - Cocoa 和 XCode 中的关键事件

objective-c - mouseDragged 事件被另一个 View 窃取

objective-c - 为什么不调用 NSResponder 的键盘操作?