NSTextField 是第一响应者,但我仍然必须在输入之前在文本框内单击

Posted

技术标签:

【中文标题】NSTextField 是第一响应者,但我仍然必须在输入之前在文本框内单击【英文标题】:NSTextField is first responder but I still must click inside the text box before typing 【发布时间】:2013-09-28 18:14:22 【问题描述】:

我的最终目标是默认选择一个 NSTextField,允许用户在不先点击文本字段的情况下开始输入。

我有一个由 NSViewController 控制的视图。该视图包含几个文本字段。 NSView 和 NSWindow 都是自定义子类。文本字段没有子类化。只是一个标准的 NSTextField。

在视图控制器的 awakeFromNIB 中,我有代码:

[[[NSApplication sharedApplication] mainWindow] makeFirstResponder:firstBox];
NSLog(@"%@",NSStringFromClass([[[[NSApplication sharedApplication] mainWindow] firstResponder] class]));

文本字段周围有一个焦点环,并且 NSLog 打印出第一响应者是 NSTextField,但我仍然需要在文本字段内单击才能开始输入。

什么可能导致该字段成为第一响应者但不可编辑?我应该从中调用 makeFirstResponder 有更好的方法吗?

【问题讨论】:

将文本字段设置为第一响应者时是前面的窗口和键吗? 是的。在 applicationDidFinishLaunching 中,我将窗口键和订单放在前面。用户将单击第一个视图上的按钮,该按钮将切换视图控制器并显示发生问题的新视图。 这似乎与我在 awakeFromNib 中制作现场第一响应者这一事实有关。如果我创建一个 IBAction 使 NSTextField 成为第一响应者并将其关联到一个按钮,当我单击该按钮时,文本字段将成为第一响应者并且其中有光标,我可以立即开始输入。 我也尝试过使用 loadView,但结果相同,字段有焦点环,但我无法输入。 - (void) loadView [super loadView]; [[[NSApplication sharedApplication] mainWindow] makeFirstResponder:firstBox]; NSLog(@"%@",NSStringFromClass([[[[NSApplication sharedApplication] mainWindow] firstResponder] class])); 【参考方案1】:

我找到了potentially useful hint on CocoaDev.com,试试这个:

[[[NSApplication sharedApplication] mainWindow] 
    performSelector: @selector(makeFirstResponder:) 
         withObject: firstBox 
         afterDelay:0.0];

【讨论】:

以上是关于NSTextField 是第一响应者,但我仍然必须在输入之前在文本框内单击的主要内容,如果未能解决你的问题,请参考以下文章

从 NSTextField 元素获取当前的第一响应者

需要在 NSTextField 上单击两次才能激活

如果不是第一响应者,为啥我可以单击 NSButton?

NSTextfield + NSMenu 和第一响应者

如何处理 NSTextField 子类的第一响应者状态?

给 NSTextField 焦点-?