2012-04-06 3 views
0

Я долгое время застрял на этом, и я искал в Интернете по всему миру решение ... Соединения в IB настроены правильно, и я могу откройте мой NSWindow в awakeFromNib следующим образом:NSWindow не будет отображаться в методе обработчика событий OSStatus

NSApp activateIgnoringOtherApps:YES]; 
[popUp makeKeyAndOrderFront:nil]; 

без проблем. Я также могу вызвать метод из awakeFromNib и открыть окно, используя те же две строки в методе.

Проблема возникает в этом методе и в любых методов, вызываемых из нее - NSWindow не открывается:

OSStatus myHotKeyHandler(EventHandlerCallRef nextHandler, EventRef anEvent, void *userData) 
{ 
    GeronimoAppDelegate *self = [[GeronimoAppDelegate alloc] init]; 
    [self.popUp makeKeyAndOrderFront:nil]; 

    GeronimoAppDelegate *appDel = (GeronimoAppDelegate *)[NSApp delegate]; 
    [appDel.popUp makeKeyAndOrderFront:nil]; 

    //Run the timer method 
    [self runBackTimer]; 
    return noErr; 
} 

Как вы можете видеть, я попробовал два подхода к открытию окна со ссылкой на appdelegate для доступа к объекту NSWindow, но ни один из них не работал. Мне нужно открыть окно из этого метода или вызванного из него метода. Я могу неправильно ссылаться на объект? (Все эти методы находятся в одном файле - GeronimoAppDelegate.m)

ответ

1

Функция дескриптора горячей клавиши, являющаяся функцией C, а не методом экземпляра Objective-C, не имеет понятия объекта «self». Вы попытались обойти это, объявив локальную переменную self, но она не указывает на какой-либо объект, представляющий интерес. Вместо этого вы создали новый и другой объект, на который он указывает, тот, который не связан с остальными объектами вашего приложения и не имеет своего свойства popUp, связанного с чем-либо (потому что он не исходит из NIB).

Ссылаясь на приложение, делегат должен сработать. Вы уверены, что выход delegate объекта приложения подключен к объекту делегирования приложения, который создается в NIB? Не могли бы вы позже отключить его или снова подключить, вызвав -setDelegate: или присвоив его свойству .delegate?

Как правило, чтобы интегрировать обратный вызов C-стиля с объектно-ориентированной программой, вам необходимо организовать передачу указателя объекта в функцию C. К счастью, сигнатура обратного вызова горячей клавиши поддерживает такую ​​конструкцию с параметром userData. Когда вы регистрируете обратный вызов, вы должны указать указатель объекта как пользовательские данные, которые должны быть переданы в обратный вызов при его вызове. В обратном вызове вы объявляете переменную-указатель объекта соответствующего типа и назначаете ей userData (в ARC для этого требуется приведение __bridge).

+0

Вот и все! У меня не было выход делегата объекта приложения, связанного с делегатом приложения. Ты спасатель жизни! Большое спасибо. –

0

Тот факт, что он открывается в awakeFromNib, но не в другом месте, предполагает, что он на самом деле не подключен, но окно отмечено «открыто при запуске», поэтому это просто происходит работать. Убедитесь, что popUp на самом деле не nil.

+0

«Visible at startup» не установлен, он подключен к объекту NSWindow «popUp» http://cl.ly/0N3p00323t2A0f0d2A1Q, и он отображается только в awakeFromNib, если я вызываю его, чтобы открыть его с помощью «[popUp makeKeyAndOrderFront: nil] ;» поэтому соединение должно быть прекрасным и, кажется, ведет себя так, как ожидалось, вне метода OSStatus и любого вызванного из этого метода. –

Смежные вопросы