2012-02-29 4 views
1

У меня есть statusitem в панели системного меню, что делает popover появляться при нажатии. Я бы хотел, чтобы popover автоматически отображался при первом запуске приложения. Я попытался добавить [self clickStatusBar:self] в метод awakeFromNib, но он не работает. Кто-нибудь знает, как это сделать?Нужно ли создавать NSPopover во время awakeFromNib?

Вот мои текущие методы:

- (void)awakeFromNib { 
    statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength]; 
    [statusItem setTitle:@"Locating..."]; 
    [statusItem setTarget:self]; 
    [statusItem setAction:@selector(clickStatusBar:)]; 
    [statusItem setHighlightMode:YES]; 
} 

- (void)clickStatusBar:(id)sender { 
    [[self popover] showRelativeToRect:[sender bounds] ofView:sender preferredEdge:NSMinYEdge]; 
} 

Я попытался добавления applicationDidFinishLaunching: в

- (void)applicationDidFinishLaunching:(NSNotification *)notification { 
    [self clickStatusBar:self]; 
} 

, но я получаю ошибку -[AppDelegate bounds]: unrecognized selector sent to instance

ответ

3

В awakeFromNib: приложение полностью не запущен , только этот файл NIB был неармирован. На этом этапе этот метод дает вам возможность завершить (объектно-локальную) инициализацию. Приложение (скорее всего) не готово для обработки событий или выполнения действий.

Вы должны вызвать это действие из метода applicationDidFinishLaunching:, необязательного метода в делетете приложения и передать элемент статуса, как это сделал бы щелчок (потому что вы запрашиваете его для bounds).

Обновление. Это сложнее, чем я думал. Оказывается, NSStatusItem не имеет представления, связанного в тот момент, когда делегат получает вызов. Я бы рискнул сказать, что это ошибка с NSStatusItem. Когда statusItem.view вызывается в applicationDidFinishLaunching:, метод popover принимает nil и жалуется.

Единственное (частичное, см.ниже) обходной путь, который я нашел, чтобы установить кнопку в целях вручную в awakeFromNib: так:

- (void)awakeFromNib 
{ 
    self.statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength]; 

    self.statusItemButton = [[NSButton alloc] initWithFrame:NSMakeRect(0, 0, 83, 22)]; 
    self.statusItemButton.title = @"Locating..."; 
    self.statusItemButton.bordered = NO; 
    [self.statusItemButton setAction:@selector(clickStatusBar:)]; 

    self.statusItem.view = self.statusItemButton; 
} 

Таким образом, вы бы иметь вид вокруг, когда приложение сделал запуск. Но будьте осторожны, это не похоже на стандартный.

PS. И любопытно, и даже не работает каждый раз. Я должен бросить мяч здесь. Сожалею. Возможно, сохраните местоположение по умолчанию, когда нажимаете один раз. Я думаю, что я видел такую ​​несогласованность в Cloud.app и с popover рядом с элементом статуса, и, может быть, теперь мы знаем почему :)

+0

Ну, я пробовал это, но я все еще получаю сообщение об ошибке (см. Мой обновленный вопрос) , Я думаю, что я вызываю 'clickStatusBar' неправильно. – wigging

+0

Вы не можете вызвать это действие в делегате приложения. Вам нужно поместить выход в делегат приложения, установить соединение в IB из этого элемента состояния в розетку, а затем вызвать действие в элементе через эту переменную или свойство. – febeling

+0

Извините, я смутился. Не обращайте внимания на часть IBOutlet (я отредактирую aswer соответственно). Вы ожидаете статус элемента как отправителя для действия, поэтому, когда вы вызываете его программно, вам нужно передать это, на месте, где теперь находится 'self'. (Я предполагаю, что вышеуказанный код является контроллером или делегатом приложения, а popover работает с кликом уже.) – febeling

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

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