我有一个窗口,显示一个带有一堆文本字段的popover。我想要这些文本字段是可列表的,但在弹出窗口时不会聚焦。为了达到这个目的,我在弹出框出现时将第一个响应者设置为nil
:
// Inside popover's view controller.
override func viewDidAppear() {
self.view.window!.makeFirstResponder(nil)
}
这工作正常,直到弹出窗口被解除,导致拥有窗口第一响应者被设置为窗口本身,而不是弹出窗口之前的第一响应者视图。但是,如果我在上面的块中执行self.view.window!.makeFirstResponder(self.view)
或者根本没有触及第一个响应者,一切都按预期工作,并且当弹出窗口被解除时,拥有窗口的第一个响应者会正确恢复。
据我所知,popover内部的更改不应该影响拥有窗口,因为popovers有自己的窗口和自己的响应链。
我非常好奇幕后发生了什么。很确定这可以归结为响应链如何工作和更新,但我无法连接点。
–––
任何人都可以解释为什么改变弹出窗口内的第一响应者到nil
会弄乱拥有窗口(在它上面显示)第一响应者当弹出窗口被解雇时?使用上述解决方法时不会影响它吗?
弹出窗口是拥有窗口的子窗口,并与其父窗口共享第一响应者。当弹出关闭时,调用_NSPopoverCloseAndAnimate:
。如果popover的第一个响应者是NSView
的子类,则在拥有窗口上调用_updateFirstResponderForIgnoredChildWindow:
,它将设置第一个响应者。如果弹出窗口的第一响应者是窗口,则不恢复拥有窗口的第一响应者。
如果popover不包含任何可以作为第一响应者的视图,则拥有窗口的文本字段保持第一响应者并接受keydowns。