【问题标题】:NSSearchField occasionally causing an NSInternalInconsistencyExceptionNSSearchField 偶尔会导致 NSInternalInconsistencyException
【发布时间】:2020-05-09 21:15:16
【问题描述】:

例外是“NSWindow:-_oldFirstResponderBeforeBecoming 不是响应者的 -becomeFirstResponder 实现之外的有效消息。”但是,根据堆栈跟踪消息 isbecomeFirstResponder 调用,所以我不知道我做错了什么。这是一个间歇性错误。

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

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

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

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

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

感谢您的帮助。

【问题讨论】:

  • 尝试使用 becomeFirstResponder 的 dispatch_async。当按键发生时,让事件循环完成它的开启。
  • 干杯我试过了。需要一段时间才能看到它是否有效,因为这是一个非常间歇性的问题。您应该发布您的评论作为答案,以便它可以被赞成/接受。
  • 如果可行的话我可能会! Similar sort of issue。我使用 async 让苹果的代码完成,然后再做我需要做的事情。

标签: macos cocoa appkit


【解决方案1】:

我找到了解决方案here

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-12
      • 2011-06-19
      • 2018-03-03
      • 2012-08-19
      • 1970-01-01
      • 2019-05-19
      相关资源
      最近更新 更多