0

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

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

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

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

我很好奇幕后发生了什么。很确定这取决于响应者链的工作方式和更新方式,但我无法连接这些点。

–––</p>

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

4

1 回答 1

2

弹出窗口是拥有窗口的子窗口,并与其父窗口共享第一响应者。当弹出窗口关闭时_NSPopoverCloseAndAnimate:被调用。如果弹出框的第一响应者是 then 的子类,NSView_updateFirstResponderForIgnoredChildWindow:在所属窗口上调用它,它将设置第一响应者。如果弹出框的第一响应者是一个窗口,那么拥有窗口的第一响应者不会被恢复。

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

于 2019-02-19T13:03:59.873 回答