Лучшая практика для ответа на событие keyDown

Я пишу свое первое приложение для какао. Это простая служебная программа - калькулятор. У меня все работает, последнее, что я хочу добавить, это то, что я хочу, чтобы приложение реагировало на события нажатия клавиш. Итак, вы можете щелкнуть мышью кнопку «4» или просто нажать клавишу «4» на клавиатуре. Я читаю всю документацию по обработке событий, но не улавливаю рекомендуемый подход для получения NSResponder (или NSView), который обрабатывает событие.

Я могу создать подкласс NSWindow и сказать разработчику интерфейса, что нужно сделать главное окно этого типа. Затем, когда я переопределяю сообщение keyDown в моем новом подклассе NSWindow, он получает события, но я не уверен, как подключить его к моему классу делегата приложения (поскольку я в основном просто хочу включить нажатую клавишу и вызвать соответствующее сообщение в делегате, что кнопка «выбрать» нацелена на действие.

Или, мне кажется, я что-то слышал об этом, изменив суперкласс класса делегата приложения с NSObject на NSView, или NSResponder, или что-то в этом роде. Я не особо задумывался над этой идеей, но я не уверен, как на самом деле получить объект делегата приложения, а затем настроить его как первого респондента (я думаю, что это то, что я хотел бы сделать).

Итак, я надеюсь, что кто-то может дать мне конкретные указания о том, как / где мне следует реализовать свой метод keyDown, но я также хотел бы понять, каковы рекомендуемые «лучшие практики» для этого. Какую архитектуру Apple считает правильной для этого? Мне так же интересно узнать, как заставить эту работу работать, как и изучить шаблон дизайна Apple, лежащий в ее основе.

Структура моей программы следующая: у меня есть один файл пера (на самом деле .xib), в котором я разработал свое окно с текстовым полем для отображения и множеством кнопок. Я зарегистрировал выходы и действия оттуда в класс AppDelegate (тот, который задает для вас стандартный шаблон проекта). Следуя шаблону MVC, у меня есть класс Calculator, который инициализирует AppDelegate, и вся фактическая логика калькулятора находится в этом классе. AppDelegate в основном просто отвечает на сообщения от кнопок, передает их методам класса Calculator, а затем запрашивает у калькулятора текущее отображаемое значение и обновляет его обратно в текстовое поле. Итак, графические элементы в моем файле пера - это «представление», AppDelegate - «контроллер», а класс Calculator - «модель». Верно?

Итак, кто должен обрабатывать события keyDown? Похоже, что представление должно их захватить и отправить в контроллер, но как мне это настроить?

Я полагаю, что потенциально связанный с этим вопрос заключается в том, что я видел упоминания о классах «оконный контроллер» и «контроллер представления». Я не уверен, что понимаю, в чем смысл этих занятий. Есть ли они в моем простом приложении? Должен ли он?


person Daniel Skarbek    schedule 10.06.2012    source источник


Ответы (1)


Используйте метод setKeyEquivalent: NSButton или установите эквивалент ключа для каждой кнопки в построителе интерфейса.

Я не уверен в «правильном» способе сделать это, но пользовательскую обработку ключевых событий можно поместить в пользовательское окно contentView следующим образом:

- (void)keyDown:(NSEvent *)theEvent {
    NSLog(@"keyDown:%@", theEvent);

    //Put event handling code here.

    [super keyDown:theEvent];
}

- (BOOL)acceptsFirstResponder {
    return YES;
}

Если кто-то знает, как это сделать, не стесняйтесь вмешиваться.

person spudwaffle    schedule 11.06.2012
comment
Спасибо, это звучит как лучший ответ на мой конкретный вопрос. Мне все еще любопытно ответить на мой более общий вопрос о том, каков правильный шаблон проектирования для переопределения метода keyDown. - person Daniel Skarbek; 11.06.2012
comment
P.S. это решает проблему почти для всех кнопок. Я делаю калькулятор программиста, поэтому некоторые из моих кнопок представляют собой двухсимвольные операторы, например ‹<. Итак, я собирался настроить свой метод keyDown для обнаружения двух символов подряд. Я также хочу отреагировать на вставку, введя все символы, вставленные в качестве команд в калькулятор, чтобы вы могли скопировать и вставить выражение для вычисления, но я думаю, что работа с копированием и вставкой - это совсем другое зверюга. - person Daniel Skarbek; 11.06.2012