在我的Cocoa应用程序中,我有一个窗口,其中包含NSTextField(按原样)和NSScrollView(子类)。我有一个NSViewController来管理包含文本字段和滚动视图的窗口的NSView。
在应用启动时,NSTextField具有焦点,键入会在该文本框中输入字符。当我按下TAB键时,它会失去焦点。但是接口中没有任何其他东西,比如NSScrollView,会获得焦点。我不能告诉任何关键事件发生的地方。
如何将焦点转移到NSScrollView,以便按键事件可以影响它(例如,箭头键,隐式搜索等)?
答案 0 :(得分:1)
首先,您应该尝试重复按Tab键以查看焦点是否会转到滚动视图或返回到文本字段。
您不会在滚动视图中说出文档视图中的内容。滚动视图本身不接受焦点,而是文档视图或其后代视图之一接受焦点,这种情况更为常见。然后,移动键将传递给它,如果没有消耗它们,他们会将响应者链冒泡到滚动视图,它会自动处理它们。
如果您确实希望滚动视图接受焦点,则需要覆盖-acceptsFirstResponder
方法以返回YES
。
Tab的行为由窗口控制。它维护一个关键的视图循环。它可以在添加和删除视图时自动重新计算关键视图循环。这可能是最可靠的方式。请参阅autorecalculatesKeyViewLoop
属性。
或者,您可以通过关闭autorecalculatesKeyViewLoop
并致电-recalculateKeyViewLoop
来手动告诉它重新计算。
或者,您可以通过在代码或Interface Builder中连接每个视图的nextKeyView
和previousKeyView
属性来自行设置关键视图循环。