4

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

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

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

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

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

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

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

ответ

3

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

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

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

    //Put event handling code here. 

    [super keyDown:theEvent]; 
} 

- (BOOL)acceptsFirstResponder { 
    return YES; 
} 

Если кто-нибудь знает правильный способ сделать это, не стесняйтесь звонить.

+0

Спасибо, это звучит как лучший ответ на мой конкретный вопрос. Мне все еще интересно узнать ответ на мой более общий вопрос о том, какой правильный шаблон дизайна предназначен для переопределения метода keyDown. –

+0

P.S. это решает его практически для всех кнопок. Я делаю «калькулятор программиста», поэтому некоторые из моих кнопок - это два символьных оператора типа «<<».Итак, я собирался настроить мой метод keyDown для обнаружения двух символов подряд. Я также хочу ответить на вставку, введя все символы, вставленные как команды в калькулятор, чтобы вы могли скопировать и вставить выражение для вычисления, но я думаю, что работа с копией и вставкой - это весь другой зверь. –

+0

См. Ответы на изменения. – spudwaffle