NSView - (void) keyDown в консольной программе - PullRequest
0 голосов
/ 15 апреля 2010

Я не получаю обратный вызов - (void) keyDown для моего унаследованного NSOpenGLView (обратите внимание, что mouseMoved также не работает, хотя я выполняю setAcceptsMouseMovedEvents: YES, но это пока не проблема). Реализует

- (BOOL)acceptsFirstResponder
{
    return YES;
}

но все равно не повезло. Мой знающий друг подразумевал, что это может быть как-то связано с тем, что приложение по-прежнему является консольным приложением, а не в комплекте .app (сейчас я его портирую). Если так: есть ли способ обойти? Может ли быть причиной что-то еще? Когда я завершаю работу с консольным приложением, я часто вижу, как все мои нажатия клавиш переходят на стандартный вывод, поэтому это кажется разумным ...

Edit:

@implementation UiMacApplication
- (void)run
{
}
- (void)terminate:(id)sender
{
    ...
}
- (void)startDummyThread:(id)sender
{
    printf("startDummyThread!\n");
}
@end

....

mApplication = (UiMacApplication*)[UiMacApplication sharedApplication];
[NSThread detachNewThreadSelector: @selector(startDummyThread:) toTarget: mApplication withObject: nil];
[[NSNotificationCenter defaultCenter] postNotificationName:NSApplicationWillFinishLaunchingNotification object: NSApp];
[[NSNotificationCenter defaultCenter] postNotificationName:NSApplicationDidFinishLaunchingNotification object: NSApp];

Основной цикл:

NSEvent* event = [mApplication  nextEventMatchingMask:  NSAnyEventMask
                                  untilDate:              nil
                                  inMode:                 NSDefaultRunLoopMode
                                  dequeue:                YES];

[mApplication sendEvent: event];
[mApplication updateWindows];

Редактировать 2: Запуск через консоль вызвал проблему. Простое преобразование его в правильный .app заставило его получать keyDown, keyUp и flagsChanged с первой попытки.

Ответы [ 2 ]

1 голос
/ 15 апреля 2010

Вы одновременно выполняете намного больше работы, чем вам нужно, и не выполняете ничего, кроме того, что вам нужно.

NSApplication уже реализует свой метод run, цикл обработки событий и т. Д. Я не знаю, почему вы пишете этот подкласс; похоже, ничего не делает NSApplication. Ваша замена для реализации NSApplication является неполной и недостаточной, поэтому она не работает.

Мое предложение состоит в том, чтобы расширить этот класс UiMacApplication и просто использовать простое NSApplication. Не бросайте свой собственный цикл обработки событий и не вызывайте run напрямую; вместо этого позвоните NSApplicationMain(). Вам, вероятно, также не нужен этот поток, но , если вам нужен, напишите делегат приложения и запустите поток оттуда.

Как правило, вам почти никогда не нужно создавать подкласс класса Какао - конечно, не для базовых вещей, таких как запуск приложения. Есть исключения, но они либо очень редки, либо четко обозначены.

1 голос
/ 15 апреля 2010

Есть ли у вас экземпляр NSApplication, и вы отправляете ему сообщение -run? Очень важно иметь возможность получать события.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...