NSSearchField 偶尔会导致 NSInternalInconsistencyException

NSSearchField occasionally causing an NSInternalInconsistencyException

异常是 "NSWindow: -_oldFirstResponderBeforeBecoming is not a valid message outside of a responder's implementation of -becomeFirstResponder." 但是,根据堆栈跟踪消息 becomeFirstResponder 调用的,所以我不知道我是什么做错了。这是间歇性错误。

用户按下一个键命令序列,这将触发一个菜单项,该菜单项向键 window 控制器发送一条消息,通知 window 上的搜索字段成为第一响应者。

这是一个总结堆栈跟踪::

[NSException raise:format:]
[NSWindow _oldFirstResponderBeforeBecoming]
[NSSearchField becomeFirstResponder]
[MyWindowController focusSearchField]
[NSApplication sendAction:to:from:]
[NSMenu performKeyEquivalent:]

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

public var searchField: NSSearchField?
@IBAction public func focusSearchField(sender: AnyObject) {
    searchField?.becomeFirstResponder()
}

感谢您的帮助。

我找到了解决方案 here

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

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

我在带有文本框的 NSPopover 中遇到了这个问题。当我删除它时,我没有将 contentViewController 设置为 nil 并且它没有解除分配。当我试图打开另一个弹出窗口时发生了异常,我知道这是因为第一响应者从不在 window

中的视图中辞职了