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: вызывается в собственном окне, и оно устанавливает первого респондента. Если первым респондентом всплывающего окна является окно, то первый респондент окна-владельца не восстанавливается.

Если во всплывающем окне нет представлений, которые могут быть первыми респондентами, то текстовое поле окна-владельца остается первым респондентом и принимает нажатия клавиш.

Другие вопросы по тегам