在故事板OSX应用程序中设置initialFirstResponder

Chr*_*ris 7 macos xcode storyboard first-responder

这个问题类似,我试图NSTextField在一个非常简单的应用程序中将第一个响应者设置为三个中的第一个.那里的建议(Window在界面构建器中设置第一个响应者)似乎不再适用,至少在涉及故事板时不适用.该Window对象确实有一个initialFirstResponder插座,但我无法通过拖拽,ctrl-drag等向NSTextField的任何一个方向设置它.

IB为我提供的结构包括一个链接到视图控制器场景的窗口控制器场景(本身只是一个空窗口)(后者又包含我的NSTextFields和标签集).

我怀疑有一些默认的假设/关联,Xcode被我的应用程序烘焙,导致Window控制器在运行时自动加载特定的视图,这就是为什么不可能绑定一个它在构建时不知道的初始响应者时间.然后让我想知道哪个生命周期调用哪个对象是正确的点,self.view.window.initialFirstResponder = myTextField在它为时已晚之前进行调用,以及如何最正确地获取对该对象的访问权.viewWillAppear或者viewDidLoad在View Controller中感觉正确,但似乎都没有可靠地产生任何影响(最初活动NSTextField因运行而异,有时似乎跟踪代码更改,但两次都没有).

到目前为止,我已经在GitHub上发布了代码

Adr*_*ers 3

initialFirstResponder仅当 NSWindow 首次出现在屏幕上时应用。根据 Xcode 文档:

\n\n
`NSWindow initialFirstResponder`\nThe view that\xe2\x80\x99s made first responder (also called the key view) the first time the window is placed onscreen.\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您想将某些内容设置为第一响应者,那么您需要调用:

\n\n

迅速: yourTextField.becomeFirstresponder()

\n\n

对象-C: [yourTextField becomeFirstresponder];

\n\n

希望有帮助!

\n\n

阿德

\n\n

编辑

\n\n

我真的把你的 .m 精简到几行:

\n\n
    #import "ViewController.h"\n\n    @implementation ViewController\n\n    #pragma mark - View lifecycle\n\n    -(void)viewWillAppear{\n        [super viewWillAppear];\n        //[self.userTextField becomeFirstResponder];\n        [self.pathTextField becomeFirstResponder];\n    }\n\n    #pragma mark - Connection actions\n\n    - (IBAction)connectClicked:(id)sender {\n\n    }\n\n    - (IBAction)cancelClicked:(id)sender {\n        // Tell the app delegate (once we\'ve actually got a pointer to it) that we want to exit\n    //    [self.delegate exitApplication];\n    }\n\n\n\n    @end\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的错!抱歉,viewWillAppear(就在视图实际显示之前)是您放置“becomeFirstResponder”的位置。

\n\n

为错误道歉!

\n

  • 不幸的是,这不是解决方案。`becomeFirstResponder` 用于询问视图是否愿意成为firstResponder(根据文档,无论如何我们都不能调用),而不是用于将其设置为firstResponder。根据我的经验,实际的firstResponder 是半随机的。它可能看起来是正确的,并且在多次运行/构建中可能不会改变,但是清理和重建可能会导致它发生变化(即使没有代码更改)。 (3认同)