2014-04-29 10 views
3

Я играю с идеей и в основном хочу NSStatusItem с NSPopoverController. Я читал обо всех проблемах, которые имели люди, но я просто хочу попробовать. Есть ли чистый способ сделать это к настоящему времени? Все версии, которые я видел, по крайней мере 1 год и suuuuper хаки.Popover NSStatusItem

Это был мой подход до сих пор, но если я нажимаю мое приложение в статусной ничего не происходит ...

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    self.statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength]; 

    //[self.statusItem setView:view]; 
    [self.statusItem setTitle:@"Test"]; 
    [self.statusItem setHighlightMode:YES]; 
    [self.statusItem setAction:@selector(activatePopover:)]; 

} 


-(IBAction)activatePopover:(id)sender 
{ 
    BOOL isEnabled = NO; 

    if (isEnabled) { 
     [self.popover showRelativeToRect:NSMakeRect(0, 0, 50, 50) ofView:statusItem.view preferredEdge:NSMinYEdge]; 

    } else { 
     [self.popover close]; 
    } 
} 

Любые идеи, как получить это работает?

Благодаря

+0

'showRelativeToRect: ofView: preferredEdge' никогда не вызывается, потому что' isEnabled' установлен в NO. – Frank

+0

'2014-04-29 17: 14: 08.377 Aves [610: 303] - [NSPopover showRelativeToRect: ofView: preferredEdge:]: нет представления. Вы должны предоставить представление. ' –

+0

Я определил' popover'as '@property (сильный) IBOutlet NSPopover * popover;' –

ответ

7

Это не будет работать без использования настраиваемого представления по данному вопросу статуса. Если вы не настроили пользовательское представление, то свойство view будет пустым (оно возвращает только пользовательские представления, а не то, что вид NSStatusItem использует внутри, когда вы просто используете setTitle).

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

Я не видел полный пример, который охватывает правильную обработку этого (по умолчанию выполнение пунктов статуса делает довольно много, которые вам придется делать все вручную), а также фиксирует поповер wonkynesses:

  • NSPopover, по умолчанию, не станет ключевым окном (некоторые элементы управления не будут работать), если вы не перезаписать canBecomeKeyWindow окна NSPopover в
  • правильно увольнение меню других элементов статуса (вы можете вызвать popUpStatusItemMenu с пустым меню правильно сфокусируйте свой статус)
  • Рисования выделенного фона с drawStatusBarBackgroundInRect
  • реагирующего на левую и правую кнопку мыши щелкает
  • Использование NSRunningApplication.currentApplication.activateWithOptions, чтобы убедиться, что все окна вашего элемента статуса становятся активными (в противном случае вашего поповер будет, хаотично, не может быть получателем ввода с клавиатурой)
  • Отклонив NSPopover с NSEvent.addGlobalMonitorForEventsMatchingMask (встроенный механизм увольнения Popovers пришел с не работать с элементами статуса)
  • Удаление элемента состояния о прекращении с NSStatusBar.systemStatusBar.removeStatusItem

Я надеюсь получить сообщение в блоге об этом в ближайшее время (примечание: я использую RubyMotion, а не Objective-C), который объясняет все эти проблемы и, надеюсь, предоставляет более легкую основу для создания menulets. Я буду обновлять этот комментарий, если напишу этот пост.

+2

МОЙ СВЯТОЙ БОГ !!! Почему Objective C и OS X являются SOOOOO сильными и трудными для понимания? –

+1

Вызов [NSRunningApplication.currentApplication activateWithOptions: NSApplicationActivateIgnoringOtherApps]; после showRelativeToRect работал для меня. – dlinsin

1

Код:

(void)initializeStatusBarItem 
{ 
    self.statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength]; 

    NSImage* image = [NSImage imageNamed:@"image"]; 
// [image setTemplate:YES]; 
    self.statusItem.button.image = image; 

    self.statusItem.highlightMode = NO; 
    self.statusItem.button.action = @selector(statusBarItemDidClick:); 
} 

- (void)statusBarItemDidClick:(NSStatusBarButton *)sender{ 
    MainViewController *mainView = [[MainViewController alloc] init]; 
    self.popoverView = [[NSPopover alloc] init]; 
    [self.popoverView setContentViewController:mainView]; 
    self.popoverView.contentSize = CGSizeMake(300, 400); 
    self.popoverView.behavior = NSPopoverBehaviorTransient; 
    [self.popoverView showRelativeToRect:sender.bounds ofView:sender preferredEdge:NSMaxYEdge]; 


} 
+0

Thankyou !!! это очень помогло, большие пальцы! 1+ – Lucasware

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

  • Нет связанных вопросов^_^