【问题标题】:Handling tabs in Cocoa view containing a text field and scrolling view处理包含文本字段和滚动视图的 Cocoa 视图中的选项卡
【发布时间】:2016-12-07 01:22:18
【问题描述】:

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

在应用启动时,NSTextField 具有焦点,并且键入会将字符输入到该文本框中。当我按 TAB 键时,它会失去焦点。但是界面中没有其他东西,如 NSScrollView,获得焦点。我不知道任何按键事件发生在哪里。

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

【问题讨论】:

    标签: objective-c macos cocoa nsresponder


    【解决方案1】:

    首先,您应该尝试反复按 Tab 键以查看焦点是否到达滚动视图或返回到文本字段。

    您不会将滚动视图中的内容作为文档视图来说明。与让滚动视图本身接受焦点不同,更常见的是文档视图或其后代视图之一接受焦点。然后,移动键将被传递给它,如果没有任何东西消耗它们,它们会将响应链冒泡到滚动视图,它会自动处理它们。

    如果你真的希望你的滚动视图接受焦点,你需要重写 -acceptsFirstResponder 方法以返回 YES

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

    或者,您可以通过关闭autorecalculatesKeyViewLoop 并调用-recalculateKeyViewLoop 手动告诉它重新计算。

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

    【讨论】:

    • 当滚动视图(文档视图)中有多个子视图,但没有一个子视图时,焦点永远不会离开文本编辑字段。但是当几个子视图有子子视图(vanilla NSViews)时,反复点击 TAB 不会显示任何焦点在滚动视图上,但最终会回到文本编辑字段。周期长度似乎与子子视图的数量有关。
    • 关闭子视图中的“acceptsFirstResponder”可以清理情况。结果他们仍然接受 mouseDown 事件,这就是为什么我认为“acceptsFirstResponder”应该为他们设置为 YES。但是为滚动视图设置“acceptsFirstResponder”似乎并没有改变任何默认行为,所以这仍然是一个谜。
    • 您如何确定滚动视图没有获得焦点?您是否尝试过更改其focusRingType?它可能默认为 none,因此不会有视觉变化。无论如何,正如我所说,文档视图本身接受焦点更为典型。例如,当表格视图位于滚动视图中时,接受焦点的是表格视图,而不是滚动视图。
    猜你喜欢
    • 2011-12-22
    • 2023-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多