强制 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?