【问题标题】:Understanding first responder behavior了解第一响应者的行为
【发布时间】:2013-09-16 08:25:37
【问题描述】:

从应用程序委托中,我创建了一个窗口并将其 contentView 设置为从 plist 规范以编程方式生成的视图。然后我把窗户带到前面。该窗口有一个工具栏,当按下工具栏上的按钮时,它应该会显示不同的 contentView。

我发现第一个内容视图出现时,其最顶部的文本字段子视图已被选为第一响应者,但是将视图从工具栏(它在窗口上设置 contentView)更改为不同的视图不会选择该视图的任何文本字段作为第一响应者。

我希望保持一致性,因此理想情况下,它要么永远不会自动选择控件作为第一响应者,要么总是自动选择控件作为第一响应者,但我真的不明白是什么进程首先制作控件首先是响应者。

有人能解释一下是什么原因造成的吗?这样我可以在切换视图时阻止它或尝试模拟它?

【问题讨论】:

    标签: cocoa first-responder


    【解决方案1】:

    hussain Shabbir 的回答是正确的,但遗漏了一些事情。

    首先,设置窗口的初始第一响应者,然后将同一个视图设为第一响应者,这是多余的。第一个的重点是导致第二个。

    其次,您需要设置窗口的初始第一响应者在使窗口可见之前

    将给定视图设置为第一次将窗口放置在屏幕上时作为第一响应者(也称为键视图)的视图。

    如果在您设置初始第一响应者时窗口已经可见,则不会发生任何事情。

    您需要在第一次使窗口可见之前设置初始第一响应者

    做到这一点的最佳位置根本不在代码中,而是在 nib 中。

    这样你就没有这两行代码了。

    更好:

    窗口有一个工具栏,当工具栏上的按钮被按下时,应该会显示不同的contentView。

    您是否考虑过使用 NSTabView?它会自动处理这个问题(每个选项卡视图项都有自己的初始第一响应者出口)。

    【讨论】:

    • 由于视图是以编程方式生成的,我将跳过 IB ......但其余的帮助很大,我将检查 NSTabView。我最终追逐了一段时间,发现 NSWindow 的 -orderFront: 导致 NSView 调用 -nextValidKeyView。作为测试,覆盖它以返回 nil 会使视图显示为未选择任何内容。我的下一个测试将是在更改视图时调用它,例如 [[view nextValidKeyView] becomeFirstResponder],所以我认为我可以得到任何一种行为。
    • 我很难让它正常工作。在 xcode 7 中,这似乎不适用于情节提要。这是一个错误还是有任何明显的原因导致它不起作用?
    【解决方案2】:

    如果您希望在单击不同视图时您的文本字段应该成为第一响应者,那么下面的两行代码应该可以工作:- 在这里根据您的情况使用以下几行:-

    [[self window] setInitialFirstResponder:(NSView *)YourTextFieldName];
    [[self window] makeFirstResponder:(NSView *)YourTextFieldName];
    

    【讨论】:

    • 如果它是窗口的初始第一响应者,您不需要告诉窗口创建视图第一响应者。您还没有指定何时需要运行此代码,甚至没有链接到 setInitialFirstResponder: 的文档。
    • 是的,彼得,无论您通过绑定提到什么,我都同意您的观点。但是我以编程方式做了同样的事情:)
    • +1 只需在textDidEndEditing 中为 NSTextField 子类调用 [self.window makeFirstResponder:self] 即可防止容器 NSTableView 更改第一响应者
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 2012-05-17
    相关资源
    最近更新 更多