Доступ к объекту ObjC из обратного вызова функции C - PullRequest
3 голосов
/ 02 июня 2011

Я немного поигрался с глобальными горячими клавишами в Carbon, и я зарегистрировал горячую клавишу.При нажатии горячей клавиши вызывается эта функция:

OSStatus myHotKeyHandler(EventHandlerCallRef nextHandler, EventRef anEvent, void *userData) {
    ...
}

Эта функция находится в том же файле, что и определение моего делегата приложения.Как мне теперь вызвать метод ObjC для моего делегата в этой функции?

[self aMethod];

Я не могу добавить void* (чтобы быть указателем на мой экземпляр класса) к функции C, потому что я не тот, кто ее вызывает.

Я пытался преобразоватьметод в метод класса и затем вызовите его с [AppDelegate aFunction], который работает, но тогда я не могу использовать переменные своего экземпляра!

Ответы [ 3 ]

8 голосов
/ 02 июня 2011

Ты изобретаешь колесо. Используйте обертку:

http://github.com/davedelong/DDHotKey

ну, может быть, не колесо , поскольку горячие клавиши не являются "тривиальными" понятиями. может ты изобретаешь дифференциал? или что-то? ;)

5 голосов
/ 02 июня 2011

Дайте указатель на ваш экземпляр класса в качестве параметра для userData при регистрации вашего обработчика событий.Затем вы получите этот указатель внутри обработчика как userData.

3 голосов
/ 03 июня 2011

Пример кода

InstallApplicationEventHandler(&MyHotKeyHandler,1,&eventType,(void *)self,NULL);
...

OSStatus MyHotKeyHandler(EventHandlerCallRef nextHandler,EventRef theEvent,
                         void *userData)
{
    [(yourAppDelegate *)userData dosomething];
}
...