Cocoa 了解第一反应者的行为

Cocoa 了解第一反应者的行为,cocoa,first-responder,Cocoa,First Responder,在app委托中,我创建了一个窗口,并将其contentView设置为从plist规范以编程方式生成的视图。然后我把窗户打开。该窗口有一个工具栏,当按下工具栏上的按钮时,它应该显示不同的contentView 我发现第一个内容视图出现时,其最顶部的文本字段子视图已被选为第一响应者,但将视图从工具栏(它在窗口上设置contentView)更改为其他视图不会选择该视图的任何文本字段作为第一响应者 我希望具有一致性,因此理想情况下,它不会自动选择一个控件作为第一响应者,或者它总是自动选择一个控件作为第一

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

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

我希望具有一致性,因此理想情况下,它不会自动选择一个控件作为第一响应者,或者它总是自动选择一个控件作为第一响应者,但我并不真正理解首先是什么过程使控件成为第一响应者


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

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

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

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

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

侯赛因·沙比尔的回答是正确的,但遗漏了一些东西

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

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

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

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

在第一次显示窗口之前,需要设置初始第一响应者

最好的地方不是在代码中,而是在nib中

这样您就不会有这两行代码了

更好的是:

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


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

侯赛因·沙比尔的回答是正确的,但遗漏了一些东西

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

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

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

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

在第一次显示窗口之前,需要设置初始第一响应者

最好的地方不是在代码中,而是在nib中

这样您就不会有这两行代码了

更好的是:

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


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

如果窗口是初始第一响应器,则无需告诉窗口创建视图第一响应器。您还没有指定何时需要运行此代码,甚至没有链接到
setInitialFirstResponder:
的文档。是的,peter,无论您通过绑定提到什么,我都同意您的观点。但我在编程中也做了同样的事情:)+1只需调用
[self.windowmakefirstresponder:self]
textdidediting
中,对于NSTextField子类,阻止容器NSTableView更改第一响应程序如果它是窗口的初始第一响应程序,则无需告诉窗口创建视图第一响应程序。您还没有指定何时需要运行此代码,甚至没有链接到
setInitialFirstResponder:
的文档。是的,peter,无论您通过绑定提到什么,我都同意您的观点。但是我用编程的方法做了同样的事情:)+1只需在
textdidediting
中调用
[self.window makeFirstResponder:self]
就可以防止容器NSTableView更改第一响应。如果视图是以编程的方式生成的,我将跳过IB。。。但其余的帮助很大,我将查看NSTabView。我对此进行了一段时间的研究,发现NSWindow的-orderFront:导致NSView调用-nextValidKeyView。作为测试,重写该选项以返回nil将使视图显示为未选择任何内容。我的下一个测试是在更改视图时调用它,比如[[view nextValidKeyView]becomeFirstResponder],所以我想我可以得到任何一种行为。我很难让它正常工作。在xcode 7中,这在故事板中似乎不起作用。这是一个bug还是有什么明显的原因导致它不工作?因为视图是以编程方式生成的,所以我将跳过IB。。。但其余的帮助很大,我将查看NSTabView。我对此进行了一段时间的研究,发现NSWindow的-orderFront:导致NSView调用-nextValidKeyView。作为测试,重写该选项以返回nil将使视图显示为未选择任何内容。我的下一个测试是在更改视图时调用它,比如[[view nextValidKeyView]becomeFirstResponder],所以我想我可以得到任何一种行为