NSWindow теряет первого респондента после увольнения NSPopover
У меня есть окно, которое представляет поповер с кучей текстовых полей. Я хочу, чтобы эти текстовые поля были табулируемыми, но не фокусировались при появлении всплывающего окна Для достижения этого я установил первый респондент nil
когда появляется поповер:
// Inside popover's view controller.
override func viewDidAppear() {
self.view.window!.makeFirstResponder(nil)
}
Это работает нормально до тех пор, пока не будет отклонен всплывающий элемент, в результате чего первый респондент окна-владельца будет настроен на само окно, а не на представление, которое было первым респондентом до появления всплывающего окна. Однако, если я сделаю self.view.window!.makeFirstResponder(self.view)
или вообще не касайтесь первого респондента в вышеприведенном блоке, все работает, как ожидалось, и первый респондент окна-владельца восстанавливается правильно, когда всплывающее окно отклоняется.
Насколько мне известно, изменения внутри всплывающего окна не должны влиять на собственное окно, поскольку у всплывающих окон есть собственные окна с собственными цепочками респондента.
Мне очень любопытно, что происходит за кулисами. Я уверен, что все сводится к тому, как работает цепочка респондента и обновляется, но я не могу соединить точки.
---
Может кто-нибудь объяснить, почему изменение первого респондента внутри поповера на nil
портит первое окно респондента (выше которого оно отображается), когда всплывающее окно отклоняется? И не влияет на это при использовании вышеупомянутого обходного пути?
1 ответ
Всплывающее окно является дочерним окном владеющего окна и разделяет первого респондента со своим родителем. Когда поповер закрывается _NSPopoverCloseAndAnimate:
называется. Если первый респондент поповера является подклассом NSView
затем _updateFirstResponderForIgnoredChildWindow:
вызывается в собственном окне, и оно устанавливает первого респондента. Если первым респондентом всплывающего окна является окно, то первый респондент окна-владельца не восстанавливается.
Если во всплывающем окне нет представлений, которые могут быть первыми респондентами, то текстовое поле окна-владельца остается первым респондентом и принимает нажатия клавиш.