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

问题描述 投票:0回答:1

我有一个窗口,显示一个带有一堆文本字段的popover。我想要这些文本字段是可列表的,但在弹出窗口时不会聚焦。为了达到这个目的,我在弹出框出现时将第一个响应者设置为nil

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

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

据我所知,popover内部的更改不应该影响拥有窗口,因为popovers有自己的窗口和自己的响应链。

我非常好奇幕后发生了什么。很确定这可以归结为响应链如何工作和更新,但我无法连接点。

–––

任何人都可以解释为什么改变弹出窗口内的第一响应者到nil会弄乱拥有窗口(在它上面显示)第一响应者当弹出窗口被解雇时?使用上述解决方法时不会影响它吗?

swift appkit first-responder responder-chain
1个回答
2
投票

弹出窗口是拥有窗口的子窗口,并与其父窗口共享第一响应者。当弹出关闭时,调用_NSPopoverCloseAndAnimate:。如果popover的第一个响应者是NSView的子类,则在拥有窗口上调用_updateFirstResponderForIgnoredChildWindow:,它将设置第一个响应者。如果弹出窗口的第一响应者是窗口,则不恢复拥有窗口的第一响应者。

如果popover不包含任何可以作为第一响应者的视图,则拥有窗口的文本字段保持第一响应者并接受keydowns。

© www.soinside.com 2019 - 2024. All rights reserved.