При работе с этим решением я обнаружил, что когда NSStatusItem перестает отвечать на запросы, вы можете легко переопределить это поведение следующим образом:
- (BOOL)canBecomeKeyWindow {
if([self class]==NSClassFromString(@"NSStatusBarWindow")) {
CBStatusBarView* view = [((CBAppDelegate*)[NSApp delegate]) statusItemView];
if(![view isActive]) return NO;
}
return YES;
}
Вы проверите класс окна.если он соответствует NSStatusBarWindow , мы можем каким-то образом проверить, активен ли NSStatusItem .Если это так, это означает, что мы должны вернуть YES, потому что таким образом NSPopover из NSStatusItem будет иметь все события клавиатуры.
Что я использую для проверкиесли NSStatusItem был нажат (или активен), это означает, что в моем собственном пользовательском представлении у меня есть значение bool, которое изменяется, когда пользователь нажимает на NSStatusItem , система автоматически проверяет "canBecomeKeyWindow" и когда это произойдет, он вернет NO , и после того, как пользователь нажмет на него (пока он возвращает NO ), он изменит значение bool и возвращает YES при повторном запросе системы (при нажатии NSPopover для редактирования NSTextField ).
Sidenotes :
- CBStatusBarView - это мое пользовательское представление для NSStatusItem
- CBAppDelegate - мой класс делегата приложения