NSWindow теряет первого респондента после увольнения NSPopover - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть окно, которое представляет поповер с кучей текстовых полей.Я хочу, чтобы эти текстовые поля были табулируемыми, но не фокусировались при появлении всплывающего окна.Чтобы добиться этого, я устанавливаю для первого респондента значение nil, когда появляется всплывающее окно:

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

Это работает до тех пор, пока всплывающее окно не будет закрыто, в результате чего первый респондент-владелец окна будет установлен на само окно., а не мнение, которое было первым респондентом до появления поповера.Однако, если я выполняю self.view.window!.makeFirstResponder(self.view) или вообще не касаюсь первого респондента в вышеуказанном блоке, все работает, как ожидалось, и первый респондент окна-владельца восстанавливается правильно, когда всплывающее окно отклоняется.

МоемуИзменения в знаниях внутри всплывающего окна не должны влиять на собственное окно, поскольку у всплывающих окон есть собственные окна с собственными цепочками респондента.

Мне очень любопытно, что происходит за кулисами.Я уверен, что все сводится к тому, как работает цепочка респондента и обновляется, но я не могу соединить точки.

–––

Может кто-нибудь объяснить, почему изменение первого респондента внутри поповера на nil портит первый респондент окна-владельца (над которым он отображается), когда поповер увольняется?И не влияет на это при использовании вышеупомянутого обходного пути?

1 Ответ

0 голосов
/ 19 февраля 2019

Всплывающее окно является дочерним окном владеющего окна и разделяет первого респондента со своим родителем.Когда поповер закрывается, вызывается _NSPopoverCloseAndAnimate:.Если первый ответчик всплывающего окна является подклассом NSView, то в окне-владельце вызывается _updateFirstResponderForIgnoredChildWindow:, и он устанавливает первого ответчика.Если первым респондентом всплывающего окна является окно, то первый респондент окна-владельца не восстанавливается.

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

...