Най-добра практика за отговор на събитие keyDown

Пиша първото си приложение за какао. Това е просто помощно приложение - калкулатор. Всичко ми работи, последното нещо, което искам да добавя е, че искам приложението да реагира на ключови събития при натискане. Така че можете да щракнете върху бутона "4" с мишката или можете просто да натиснете клавиша "4" на клавиатурата. Чета цялата документация за обработка на събития, но не приемам препоръчания подход за получаване на NSResponder (или NSView), който обработва събитието.

Мога да направя подклас на NSWindow и да кажа на създателя на интерфейса да направи главния прозорец от този тип. След това, когато заместя съобщението keyDown в моя нов подклас NSWindow, той получава събитията, но не съм сигурен как да го свържа с класа делегат на моето приложение (тъй като по същество просто искам да включа натиснатия клавиш и да извикам съответното съобщение в делегата, към който е насочено действието на бутона "избор".

Или мисля, че чух нещо за правене на това чрез промяна на супер класа на класа делегат на приложението от NSObject на NSView, или NSResponder или нещо подобно. Не съм се занимавал много с тази идея, но не съм сигурен как всъщност да получа делегирания обект на приложението, след което всъщност да го настроя като първи отговор (мисля, че това е, което бих искал да направя).

Така че се надявам, че някой може да ми даде конкретни указания как/къде трябва да внедря моя метод keyDown, но също така бих искал да разбера каква е препоръчителната „най-добра практика“ за това. Какво според Apple е правилната архитектура за това? Интересувам се да науча как да направя това да работи толкова много, колкото и да науча модела на дизайн на Apple зад него.

Структурата на моята програма е следната: имам един nib файл (всъщност .xib), където съм проектирал моя прозорец с текстово поле за показване и шепа бутони. Регистрирах търговски обекти и действия от там към класа AppDelegate (този, който стандартният шаблон на проект настройва за вас). Следвайки MVC модела, след това имам клас Calculator, който AppDelegate инициализира и цялата действителна логика на калкулатора е в този клас. AppDelegate всъщност просто отговаря на съобщения от бутоните, предава ги на методите в класа Calculator и след това пита калкулатора за текущата стойност на дисплея и я актуализира обратно в текстовото поле. И така, графичните елементи в моя nib файл са "изглед", AppDelegate е "контролер", а класът Calculator е "модел". нали

И така, кой трябва да управлява събитията keyDown? Изглежда, че изгледът трябва да ги улови и да ги изпрати на контролера, но как да настроя това?

Предполагам, че потенциално свързан въпрос е, че съм виждал споменавания на класове "window controller" и "view controller". Не съм сигурен, че разбирам какъв е смисълът от тези класове. Моето просто приложение има ли ги? Трябва ли?


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