Почему экземпляр NSWindow или NSView обрабатывает свои собственные ключевые события, а не его делегат? - PullRequest
3 голосов
/ 21 июня 2009

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

В моей программе у меня есть подкласс NSWindow, который занимает весь экран и должен обязательно обрабатывать ключевые события. Существует несколько основных команд, которые могут изменить все состояние программы (например, приостановить таймер, когда пользователь нажимает пробел), для которых нет смысла иметь подпредставления, подобные дескриптору NSTextField.

Мне кажется, что делегат (контроллер) должен получить эти события. Вместо этого я нахожу, что мне нужно либо написать кучу грязного связующего кода, чтобы окно (с помощью его селекторов keyDown: и interpretKeyEvents:) уведомило контроллер, либо мне просто нужно переместить кучу кода контроллера в подкласс NSWindow. сам по себе.

Это грязно, и моя интуиция говорит мне, что я что-то упустил. Есть ли более чистое решение?

1 Ответ

4 голосов
/ 21 июня 2009

Если вы настроили его правильно, делегат NSWindow получит сообщения. Какао использует цепочку респондента для пересылки сообщений от первого респондента - представление ключа для ключевых сообщений и представление, которое было нажато / перемещено / и т.д. для сообщений мыши - обратно через суперпредставления, через окно и, в конце концов, к делегату окна. На сайте Apple .

есть довольно хорошая диаграмма типичной цепочки респондентов.

Вам действительно никогда не придется создавать подклассы NSWindow, если вы не реализуете какой-то необычный рисунок окна или что-то еще в этом направлении. Какао предоставляет класс NSWindowController, который ведет себя как контроллер для окна и его содержимого.

Обычный шаблон - создать подкласс NSWindowController и добавить к нему свои IBOutlet, а затем использовать NIB для размещения содержимого окна. Вы делаете свой NSWindowController подкласс классом прокси-сервера Владельца Файла в Интерфейсном Разработчике. И вы также назначаете окно delegate контроллеру окна, чтобы оно могло стать частью цепочки респондента. Наконец, для создания окон вы используете NSWindowController метод initWithWindowNibName:, который автоматизирует загрузку NIB с новым оконным контроллером в качестве владельца файла.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...