2016-12-07 63 views
0

在我的Cocoa应用程序中,我有一个包含NSTextField(原样)和NSScrollView(子类)的窗口。我有一个NSViewController来管理包含文本字段和滚动视图的窗口的NSView。在Cocoa视图中处理包含文本字段和滚动视图的选项卡

在应用程序启动时,NSTextField具有焦点,并且键入将字符输入到该文本框中。当我按下TAB键时,它失去了焦点。但是NSScrollView等界面中没有其他任何东西获得焦点。我无法确定任何关键事件发生的地方。

如何将焦点转移到NSScrollView,以便按键事件可以影响它(例如,箭头键,隐式搜索等)?

回答

1

首先,您应该尝试重复触碰Tab以查看焦点是否曾经滚动到滚动视图或回到文本字段。

你不会在文档视图中说什么在滚动视图中。而不是让滚动视图本身接受焦点,文档视图或其后代视图之一接受焦点更为常见。然后,移动键将被传递给该移动键,如果没有消耗它们,它们会将响应者链放到滚动视图上,并自动处理它们。

如果您确实希望滚动视图接受焦点,则需要覆盖-acceptsFirstResponder方法以返回YES

Tab的行为由窗口控制。它维护一个关键的视图循环。它可以在添加和删除视图时自动重新计算关键视图循环。这可能是最可靠的方法。请参阅autorecalculatesKeyViewLoop属性。

或者,您可以手动通过关闭autorecalculatesKeyViewLoop并致电-recalculateKeyViewLoop来根据需要重新计算它。

或者,您可以通过在代码或Interface Builder中连接每个视图的nextKeyViewpreviousKeyView属性来明确设置密钥视图循环。

+0

当滚动视图(文档视图)中存在多个子视图时,但它们都没有任何子子视图时,焦点不会离开文本编辑字段。但是当几个子视图有子子视图(vanilla NSViews)时,反复敲击TAB不会在滚动视图上显示任何焦点,但最终会返回到文本编辑字段。周期长度似乎与子子视图的数量有关。 – jsbox

+0

在子子视图中关闭“accepFirstResponder”以清除状况。原来,他们仍然接受mouseDown事件,这就是为什么我认为“accepFirstResponder”应该被设置为YES。但是为滚动视图设置“accepFirstResponder”并不会改变任何默认行为,所以这仍然是一个谜。 – jsbox

+0

你如何确定滚动视图没有得到重点?你有没有尝试改变其'focusRingType'?这可能是没有的,所以不会有任何视觉上的改变。无论如何,正如我所说,文档视图本身更为典型地接受焦点。例如,当表视图位于滚动视图内时,它是接受焦点的表视图,而不是滚动视图。 –

相关问题