2013-04-07 1 views
2

Я изучаю Objective-C, создавая приложение для базового калькулятора для OSX. Все работает красиво, за исключением того, что мне нужно разрешить нажатие определенных клавиш на клавиатуре, чтобы сделать то же самое, что если бы вы нажали кнопки на интерфейсе.KeyEvents в какао и XCode

Все, что я читаю, говорит, что для их захвата вы должны иметь логику в подклассе NSResponder. Моя проблема связана с тем, как я «подключаю» этот файл. Создание нового .h и .m файл, который подклассом NSResponder как например:

Responder.h


#import <Foundation/Foundation.h> 

@interface Responder : NSResponder 

    - (void)keyDown:(NSEvent *)event; 

@end 

Responder.m


#import "Responder.h" 

@implementation Responder 

- (void)keyDown:(NSEvent *)event { 
    NSAlert *alert = [[NSAlert alloc] init]; 
    [alert addButtonWithTitle:@"OK"]; 
    [alert setMessageText:@"Hey"]; 
    [alert setInformativeText:@"You Pressed A Key!"]; 
    [alert setAlertStyle:NSWarningAlertStyle]; 
    [alert runModal]; 
} 

@end 

Как приложение знает, как использовать этот файл? Есть ли где-то в интерфейсе файл .xib, где я перетаскиваю эту синюю стрелку и «подключаю» ее где-нибудь? Я вообще делаю это правильно? Я давно искал это, и все в значительной степени предполагает, что я знаю, как получить подкласс NSResponder в моем приложении. Думаю, я действительно теряю фундаментальную концепцию. Любая помощь приветствуется!

+0

Очень хорошо выражено. Я хочу, чтобы все задавали вопросы таким образом! – matt

ответ

7

Когда люди говорят «в подклассе NSResponder», они не обязательно означают, что вы должны сделать новый подкласс NSResponder. Что они означают, так это: нажатия клавиш обрабатываются респондентами. Ваша структура приложения заполнена ответами! Итак, чтобы вмешаться в процесс обработки ключей, подкласс один из те (так что у вас есть где-то поставить код).

"Основная концепция", что вам не хватает является Ответчик цепи:

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/EventOverview/EventArchitecture/EventArchitecture.html

(Прокрутите вниз до заголовка "Ответчик Chain".)

Частым место поставить этот вид кода является оконным контроллером. NSWindowController - подкласс NSResponder. Это высоко в цепочке ответчиков, и у вас, вероятно, уже есть класс для этого.

Другой вариант - использовать представление. NSView - это подкласс NSResponder, и ваше окно полно представлений. Это не было бы удивительно, чтобы положить в противном случае инертный NSView в задней части все в окне, просто функционировать в качестве обратного хода NSResponder перехватывать события, которые идут вверх по цепочке.

+0

Супер ответ, это помогло мне понять, что лучше. Спасибо за попытку. Мы цепь :) – 2013-04-07 14:54:44

+0

@matt, Это хороший ответ. Я все еще скучаю по одному маленькому кусочку. Прямо сейчас у меня есть класс AppDelegate, который он автоматически создал для меня. Я создал класс AppController, который является NSObject. Кроме этого, я предполагаю, что .xib-файл выполняет некоторую «магию» и добавляет в Windows/Views во время компиляции. Я заметил, что я могу установить пользовательский класс для окна, это то, что я должен делать? –

+1

Нет «волшебства». Проблема в том, что вы не понимаете, что такое .xib-файл (nib) * is *? Это всего лишь набор экземпляров, которые появляются (экземпляр объекта), когда загружается nib (что в этом случае происходит при запуске приложения). Это во время выполнения, а не во время компиляции. Однако «что такое .xib/nib» было бы совсем другим вопросом! – matt