Почему я могу нажать NSButton, если он не первый респондент?

Я пытаюсь реализовать класс как NSResponder в C++, на вещи, которые я не понимаю, это:

Все взаимодействия с клавиатурой и мышью отправляются первому респонденту, поэтому, если, например, NSTextField является первым респондентом, как это сделать другому? NSButton в том же виде знаете, что это было нажата? Если текстовое поле не хочет щелкать мышью, оно отправляет его своему суперпредставлению, а его суперпредставление отправляет его в контроллер представления. Таким образом, событие, вызываемое мышью, никогда не достигает кнопки.

Это, вероятно, довольно очевидно, но я не могу обернуть это вокруг головы в данный момент.

1 ответ

Решение

Все взаимодействия клавиатуры и мыши отправляются первому респонденту

Это неверно Из Руководства по обработке событий Какао:

Объект окна... отправляет большинство событий объекту NSView, связанному с действием пользователя, в сообщении NSResponder, таком как mouseDown: или keyDown:....

Объект, получающий сообщение о событии, немного отличается по типу события. Для событий мыши и планшета объект NSWindow отправляет событие в представление, над которым пользователь нажал кнопку мыши или стилуса. Он отправляет большинство ключевых событий первому респонденту ключевого окна.

Это различие между путями мыши и ключевых событий повторяется в соответствующих разделах, относящихся к этим типам событий.

Кнопка "знает", когда на нее нажимали, потому что она была нажата. Окно выясняет, что было под курсором мыши, используя -[NSView hitTest:] метод.

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