NSSearchField偶尔会导致NSInternalInconsistencyException

tob*_*fin 5 macos cocoa appkit

例外情况是"NSWindow:-_oldFirstResponderBeforeBecoming不是响应者执行-becomeFirstResponder之外的有效消息." 然而,根据堆栈跟踪信息从所谓的becomeFirstResponder,所以我不知道我做错了.这是间歇性错误.

用户按下键命令序列,该键命令序列触发菜单项,该菜单项向键窗口控制器发送消息,该键控窗口控制器告知窗口上的搜索字段成为第一响应者.

这是一个汇总的堆栈跟踪::

[NSException raise:format:]
[NSWindow _oldFirstResponderBeforeBecoming]
[NSSearchField becomeFirstResponder]
[MyWindowController focusSearchField]
[NSApplication sendAction:to:from:]
[NSMenu performKeyEquivalent:]
Run Code Online (Sandbox Code Playgroud)

窗口控制器的动作实现非常简单:

public var searchField: NSSearchField?
@IBAction public func focusSearchField(sender: AnyObject) {
    searchField?.becomeFirstResponder()
}
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助.

Jor*_*uez 9

我在这里找到了解决方案.

而不是使用becomeFirstResponder,你应该使用NSWindowmakeFirstResponder方法.

public var searchField: NSSearchField?
@IBAction public func focusSearchField(sender: AnyObject) {
    searchField?.window?.makeFirstResponder(searchField!)
}
Run Code Online (Sandbox Code Playgroud)