强制 NSSearchField 在成为第一响应者时开始编辑

Posted

技术标签:

【中文标题】强制 NSSearchField 在成为第一响应者时开始编辑【英文标题】:Force NSSearchField to Begin Editing When It Becomes First Responder 【发布时间】:2015-12-03 07:27:19 【问题描述】:

我在 NSPopover 中有一个 NSSearchField。单击 NSStatusBar 项时会打开此弹出框。

在我的 NSPopover 的视图控制器的 viewWillAppear() 中,我在我的 NSSearchField 上调用 self.view.window?.makeFirstResponder(searchField)。我希望这个搜索字段可以在弹出框出现时进行编辑。通过准备编辑,我的意思是用户不必在 NSSearchField 内单击即可开始输入。

此时,我的实现并不总是有效。有时,它会起作用,并且弹出框打开时搜索字段已准备好,光标闪烁。然而,大多数时候,尤其是当我在打开弹出框时在不同的应用程序中编辑文本时,必须单击 NSSearchField 才能进行编辑。

我已经对搜索字段进行了子类化并覆盖了它的 becomeFirstResponder() 方法,并且我可以确认它每次都会被调用。

当字段成为第一响应者时,为什么我不能从其他应用程序“窃取”编辑我的搜索字段的权利?这甚至可能吗?

【问题讨论】:

有可能,但不推荐;将焦点从另一个应用程序上转移开本质上就像恶意软件。 我明白你的意思。话虽如此,一些应用程序会这样做:如果您在文本字段中输入并打开消息应用程序,则您输入消息的 NSTextField 会自动编辑。也许这种行为只适用于 Apple? 通常它是一个应用程序的辅助工具,将被安装然后授予该类型行为的权限;并非 Apple 应用所独有。 【参考方案1】:

您应该使用viewDidAppear: 使搜索字段成为第一响应者。

通常,当调用viewWillAppear: 时,视图还不在视图层次结构中,因此window 属性为nil(并且您的可选链接将不会调用makeFirstResponder)。

【讨论】:

这是有道理的,但不幸的是由于某种原因它并没有解决它。在这两种情况下,无论我是从 viewWillAppear: 还是 viewDidAppear: 调用,NSSearchField 肯定会收到调用。此外,如果我在调用后检查窗口的第一响应者,它就是 NSSearchField。【参考方案2】:

事实证明,关键是将我的应用程序带到最前沿。

我可以通过调用NSApplication.sharedApplication().activateIgnoringOtherApps(true) 为我的应用程序提供系统焦点。我的 NSSearchField 已经成为第一响应者,现在可以直接编辑了。

【讨论】:

以上是关于强制 NSSearchField 在成为第一响应者时开始编辑的主要内容,如果未能解决你的问题,请参考以下文章

完成后辞职 NSSearchField 的第一响应者的干净方法?

iOS——是不是可以强制 UILabel 子类对象成为第一响应者?

为啥 uitextfield 在成为第一响应者时从不返回 nil?

iOS 编程:更详细地了解第一响应者

在 NSSearchField 子类的 drawRect 中设置背景颜色

NSSearchField:如何清除选择(设置选定范围)