NSWindow在解雇NSPopover后失去了第一响应者



我有一个窗口,显示一个带有一堆文本字段的弹出窗口。我希望这些文本字段是可选项卡的,但在弹出框出现时不聚焦。为了实现这一点,我将第一个响应者设置为nil弹出框出现时:

// Inside popover's view controller.
override func viewDidAppear() {
self.view.window!.makeFirstResponder(nil)
}

这一直工作正常,直到弹出框被关闭,导致拥有窗口第一响应者被设置为窗口本身,而不是弹出框出现之前作为第一个响应者的视图。但是,如果我在上面的块中self.view.window!.makeFirstResponder(self.view)或根本没有触摸第一响应者,一切都按预期工作,并且在弹出窗口被关闭时,拥有窗口的第一响应者会正确恢复。

据我所知,弹出框内部的更改不应影响拥有窗口,因为弹出框有自己的窗口和自己的响应器链。

我很好奇幕后发生了什么。很确定这归结为响应者链的工作方式和更新方式,但我无法将这些点联系起来。

–––

谁能解释为什么当弹出框被关闭时,将弹出框内的第一响应者更改为nil会弄乱拥有窗口(在其上方显示)的第一响应者?并且在使用上述解决方法时不会影响它?

弹出窗口是所属窗口的子窗口,与其父级共享第一响应者。当弹出框关闭时_NSPopoverCloseAndAnimate:被调用。如果弹出框的第一个响应者是NSView的子类,则会在拥有窗口中调用_updateFirstResponderForIgnoredChildWindow:,它将设置第一个响应者。如果弹出框的第一个响应者是窗口,则不会还原所属窗口的第一个响应者。

如果弹出框不包含任何可以成为第一响应者的视图,则拥有窗口的文本字段将保持第一响应者并接受键控。

最新更新