我在Mac OS X应用程序中要求用户能够在单个窗口中的以下项目之间进行切换,
- 工具栏中的 NSSearchField
- NSBrowser
- NSCollectionView
- NSCollectionView (第二个(
- NSComboBox
当用户仅在文本框和列表之间具有 Tab 键时。由于某种原因,NSBrowser似乎不算作一个列表,工具栏中的NSSerachField似乎不算作一个文本框。但是如果我移动选项卡,我可以在 NSSerachField 中向后移动选项卡
如果我将控件设置之间的选项卡更改为所有控件之间的选项卡,NSBrowser的选项卡也是如此,但是我有一个单独的问题,您无法跳出NSSearchField。我假设这意味着我的下一个 KeyView 链是正常的,或者当启用所有控件之间的选项卡时,下一个 KeyView 值只是完全忽略。
我在界面构建器中设置了下一个键视图。
有没有办法让Mac OS将NSBrowser视为一个列表,我已经在对NSBrowser进行子类化了。如果文本框在工具栏中,则无法按 Tab 键进入是否有原因。
另外一个问题是,NSBrowser和第一个NSCollectionView位于NSTabView中,第二个NSCollectionView也在NSTabView中,NSTabViews动态地添加和删除NSTabeViewItems,因此内容有点像文档。我已将 NSTabViews 设置为下一个 KeyView,然后在将 NSTabViewItems 添加到 NSTabView 后立即设置了初始 FirstResponder。我还为NSBrowser设置了nextKeyView,以切换到NSCollectionView。窗口的初始FirstResponder设置为第一个NSTabView。
附加信息我有自动重新计算KeyViewLoop到NO。我已经设法让它暂时工作,通过在代码中设置下一个响应者,但随后似乎发生了一些事情,Cocoa 去改变了这一切。
我发现的唯一解决方案是子类NSWindow并覆盖selectKeyViewPrecedingView:和selectKeyViewFollowView:,我们有这种奇怪的动态将NSTabViewItems添加到NSTabView,我认为这可能会破坏默认功能。
此解决方案不能解决从 NSSearchField 中跳出 Tab 键的问题,这可能使用户可以触发搜索操作,因此在 NSSearchField 中的制表符不会落入窗口,我可能最终会子类化 NSSearchField。
这些解决方案有点黑客,我宁愿只使用Apple的默认功能,但这不是一个选择。