Я пишу свое первое приложение для какао. Это простая служебная программа - калькулятор. У меня все работает, последнее, что я хочу добавить, это то, что я хочу, чтобы приложение реагировало на события нажатия клавиш. Итак, вы можете щелкнуть мышью кнопку «4» или просто нажать клавишу «4» на клавиатуре. Я читаю всю документацию по обработке событий, но не улавливаю рекомендуемый подход для получения NSResponder (или NSView), который обрабатывает событие.
Я могу создать подкласс NSWindow и сказать разработчику интерфейса, что нужно сделать главное окно этого типа. Затем, когда я переопределяю сообщение keyDown в моем новом подклассе NSWindow, он получает события, но я не уверен, как подключить его к моему классу делегата приложения (поскольку я в основном просто хочу включить нажатую клавишу и вызвать соответствующее сообщение в делегате, что кнопка «выбрать» нацелена на действие.
Или, мне кажется, я что-то слышал об этом, изменив суперкласс класса делегата приложения с NSObject на NSView, или NSResponder, или что-то в этом роде. Я не особо задумывался над этой идеей, но я не уверен, как на самом деле получить объект делегата приложения, а затем настроить его как первого респондента (я думаю, что это то, что я хотел бы сделать).
Итак, я надеюсь, что кто-то может дать мне конкретные указания о том, как / где мне следует реализовать свой метод keyDown, но я также хотел бы понять, каковы рекомендуемые «лучшие практики» для этого. Какую архитектуру Apple считает правильной для этого? Мне так же интересно узнать, как заставить эту работу работать, как и изучить шаблон дизайна Apple, лежащий в ее основе.
Структура моей программы следующая: у меня есть один файл пера (на самом деле .xib), в котором я разработал свое окно с текстовым полем для отображения и множеством кнопок. Я зарегистрировал выходы и действия оттуда в класс AppDelegate (тот, который задает для вас стандартный шаблон проекта). Следуя шаблону MVC, у меня есть класс Calculator, который инициализирует AppDelegate, и вся фактическая логика калькулятора находится в этом классе. AppDelegate в основном просто отвечает на сообщения от кнопок, передает их методам класса Calculator, а затем запрашивает у калькулятора текущее отображаемое значение и обновляет его обратно в текстовое поле. Итак, графические элементы в моем файле пера - это «представление», AppDelegate - «контроллер», а класс Calculator - «модель». Верно?
Итак, кто должен обрабатывать события keyDown? Похоже, что представление должно их захватить и отправить в контроллер, но как мне это настроить?
Я полагаю, что потенциально связанный с этим вопрос заключается в том, что я видел упоминания о классах «оконный контроллер» и «контроллер представления». Я не уверен, что понимаю, в чем смысл этих занятий. Есть ли они в моем простом приложении? Должен ли он?