NSTextFields与nextKeyView之间的标签

时间:2017-05-12 17:44:03

标签: macos cocoa interface-builder nstextfield nsviewcontroller

我有一个具有以下布局的NSViewController,使用故事板设置:

每个NSTextField的nextKeyView出口按照屏幕截图中显示的顺序配置为下一个NSTextField。例如,我在IB中选择了服务器NSTextField,并从Connectivity检查器中的nextKeyView插座拖动到登录NSTextField,并对其余字段执行相同的操作。

当应用程序启动时,任何字段上的任何选项卡按下都会将选择移动到第一个NSTextField。如何在字段之间实现所需的标签?

我在各自的WindowController中尝试了这个,但无济于事:

- (void)windowDidLoad {
    [super windowDidLoad];

    self.window.initialFirstResponder = self.serverTextField;
}

2 个答案:

答案 0 :(得分:6)

这似乎是最详细的answer,来自Justin Bur发布到cocoa-dev邮件列表(2007年1月31日)。

  

多年来,人们多次询问为什么要关键   视图循环不能正常工作。大多数这些查询永远不会得到   在名单上回答。无法找到关键视图循环的帮助后   在这个列表或网站上的问题,我做了一些   实验

     

关键视图循环可能有问题需要处理。它旨在   只是神奇地工作,所以在大多数情况下它不是问题。但如果它   没有工作,很难弄清楚为什么不这样做。这是   获得有效的关键视图循环的一些准则。

     
      
  1. 考虑是否可以满足自动生成的键视图循环。每个响应者的左上角确定其位置   在循环。循环从左上角到右下角,依次排列   行(至少从左到右的脚本)。这是迄今为止最容易的   解。要启用此功能,请确保窗口initialFirstResponder   是。另请参阅-[NSWindow recalculateKeyViewLoop]

  2.   
  3. 如果自动键视图循环不合适,请尽可能使用Interface Builder设置自己的键视图循环。窗口   必须设置initialFirstResponder插座 才能停用   自动密钥循环生成。从围绕循环的响应者,   设置循环中每个项目的nextKeyView出口。 (如果需要的话,   最后一项' s nextKeyView可以设置为第一项,从而关闭   循环。)对于任何带滚动条的视图(NSTextViewNSTableView等),   设置NSScrollView时,您应该使用封闭的nextKeyView

  4.   
  5. 如果您在代码中创建了任何响应者,请尽早将它们拼接到关键视图循环中(最好在awakeFromNib中   或者-[NSWindowController windowDidLoad])。   对于每个(序列)新项目,您必须使用调用-[NSView setNextKeyView:],因此:一次制作   上一个项目指向(第一个)新项目,(调用每个项目)   新项目指向下一个),最后制作(最后)新项目   指向其继任者。

  6.   
  7. 如果您的窗口有工具栏,那么有兴趣成为关键视图的工具栏项会自动添加和删除自己作为   工具栏显示或隐藏。工具栏没有考虑到   返回值-[NSWindow autorecalculatesKeyViewLoop]。工具栏项目   总是放在最左边项目之前的循环中。有   没有简单的方法可以改变这一点。

  8.   
  9. 一旦显示窗口,修改关键视图循环就非常困难 - 特别是如果你正在使用   NSScrollViewNSTabView。这些(和其他?)是特殊情况   因为他们自动将包含的视图插入到循环中。   有关initialFirstResponder和关键视图循环的信息   NSTabViewItem,请参阅适用于OS X 10.1的AppKit发行说明   

  10.   
  11. 如果您的项目有时应该在循环中,而其他时候没有,则不建议将它们拼接进出   循环。相反,子类-[NSResponder acceptsFirstResponder]为   这些项目。如果某个项目从此方法返回,则会保留该项目   离开(暂时);如果它返回,它将返回   进入循环。或者,如果该项目来自NSControl(它   可能是),你可以打电话给setRefusesFirstResponder:

  12.   
  13. 如果您犯了错误,您的关键视图循环将停止在一个方向或两个方向上运行。一旦它破裂它就会破碎。至   调试,注释掉对setNextKeyView:的调用或   setInitialFirstResponder:直到它再次运作。违规的电话是   可能试图在存在的情况下修改关键视图循环   NSScrollViewNSTabView,在这些对象已经完成之后   幕后循环。将呼叫移至较早的点,或   没有。 (如果您没有拨打setNextKeyView:,请检查您的   笔尖 - 确保窗口的initialFirstResponder已设置   nextKeyView个网点按您想要的方式链接在一起。)

  14.   
  15. 在“系统偏好设置/键盘”中鼠标/键盘快捷方式,在"全键盘访问"下的窗格底部,您可以控制   关键视图循环是包括所有控件还是仅包含文本字段和   滚动列表(^ F7切换)。您应该测试您的关键视图循环   在每个州都有此设置。

  16.         

    这些指南是通过实验确定的,可能并非完全如此   准确。我们非常欢迎更正和进一步解释。

答案 1 :(得分:0)

在窗口控制器的initialFirstResponder或视图控制器的windowDidLoad中设置窗口viewWillAppear。如果initialFirstResponder未设置在窗口makeKeyAndOrderFront之前,则会调用recalculateKeyViewLoop