我有一个具有以下布局的NSViewController,使用故事板设置:
每个NSTextField的nextKeyView出口按照屏幕截图中显示的顺序配置为下一个NSTextField。例如,我在IB中选择了服务器NSTextField,并从Connectivity检查器中的nextKeyView插座拖动到登录NSTextField,并对其余字段执行相同的操作。
当应用程序启动时,任何字段上的任何选项卡按下都会将选择移动到第一个NSTextField。如何在字段之间实现所需的标签?
我在各自的WindowController中尝试了这个,但无济于事:
- (void)windowDidLoad {
[super windowDidLoad];
self.window.initialFirstResponder = self.serverTextField;
}
答案 0 :(得分:6)
这似乎是最详细的answer,来自Justin Bur发布到cocoa-dev邮件列表(2007年1月31日)。
多年来,人们多次询问为什么要关键 视图循环不能正常工作。大多数这些查询永远不会得到 在名单上回答。无法找到关键视图循环的帮助后 在这个列表或网站上的问题,我做了一些 实验
关键视图循环可能有问题需要处理。它旨在 只是神奇地工作,所以在大多数情况下它不是问题。但如果它 没有工作,很难弄清楚为什么不这样做。这是 获得有效的关键视图循环的一些准则。
考虑是否可以满足自动生成的键视图循环。每个响应者的左上角确定其位置 在循环。循环从左上角到右下角,依次排列 行(至少从左到右的脚本)。这是迄今为止最容易的 解。要启用此功能,请确保窗口
initialFirstResponder
是零。另请参阅-[NSWindow recalculateKeyViewLoop]
。如果自动键视图循环不合适,请尽可能使用Interface Builder设置自己的键视图循环。窗口 必须设置
initialFirstResponder
插座 才能停用 自动密钥循环生成。从围绕循环的响应者, 设置循环中每个项目的nextKeyView
出口。 (如果需要的话, 最后一项' snextKeyView
可以设置为第一项,从而关闭 循环。)对于任何带滚动条的视图(NSTextView
,NSTableView
等), 设置NSScrollView
时,您应该使用封闭的nextKeyView
。如果您在代码中创建了任何响应者,请尽早将它们拼接到关键视图循环中(最好在
awakeFromNib
中 或者-[NSWindowController windowDidLoad]
)。 对于每个(序列)新项目,您必须使用调用-[NSView setNextKeyView:]
,因此:一次制作 上一个项目指向(第一个)新项目,(调用每个项目) 新项目指向下一个),最后制作(最后)新项目 指向其继任者。如果您的窗口有工具栏,那么有兴趣成为关键视图的工具栏项会自动添加和删除自己作为 工具栏显示或隐藏。工具栏没有考虑到 返回值
-[NSWindow autorecalculatesKeyViewLoop]
。工具栏项目 总是放在最左边项目之前的循环中。有 没有简单的方法可以改变这一点。一旦显示窗口,修改关键视图循环就非常困难 - 特别是如果你正在使用
NSScrollView
或NSTabView
。这些(和其他?)是特殊情况 因为他们自动将包含的视图插入到循环中。 有关initialFirstResponder和关键视图循环的信息NSTabViewItem
,请参阅适用于OS X 10.1的AppKit发行说明如果您的项目有时应该在循环中,而其他时候没有,则不建议将它们拼接进出 循环。相反,子类
-[NSResponder acceptsFirstResponder]
为 这些项目。如果某个项目从此方法返回否,则会保留该项目 离开(暂时);如果它返回是,它将返回 进入循环。或者,如果该项目来自NSControl
(它 可能是),你可以打电话给setRefusesFirstResponder:
。如果您犯了错误,您的关键视图循环将停止在一个方向或两个方向上运行。一旦它破裂它就会破碎。至 调试,注释掉对
setNextKeyView:
的调用或setInitialFirstResponder:
直到它再次运作。违规的电话是 可能试图在存在的情况下修改关键视图循环NSScrollView
或NSTabView
,在这些对象已经完成之后 幕后循环。将呼叫移至较早的点,或 没有。 (如果您没有拨打setNextKeyView:
,请检查您的 笔尖 - 确保窗口的initialFirstResponder
已设置nextKeyView
个网点按您想要的方式链接在一起。)- 醇>
在“系统偏好设置/键盘”中鼠标/键盘快捷方式,在"全键盘访问"下的窗格底部,您可以控制 关键视图循环是包括所有控件还是仅包含文本字段和 滚动列表(^ F7切换)。您应该测试您的关键视图循环 在每个州都有此设置。
这些指南是通过实验确定的,可能并非完全如此 准确。我们非常欢迎更正和进一步解释。
答案 1 :(得分:0)
在窗口控制器的initialFirstResponder
或视图控制器的windowDidLoad
中设置窗口viewWillAppear
。如果initialFirstResponder
未设置在窗口makeKeyAndOrderFront
之前,则会调用recalculateKeyViewLoop
。