Нужно, чтобы NSPopover появлялся во время awakeFromNib? - PullRequest
1 голос
/ 29 февраля 2012

У меня есть статусный элемент в системной строке меню, который заставляет всплывающее окно появляться при нажатии. Я хотел бы, чтобы всплывающее окно автоматически появлялось при первом запуске приложения. Я попытался добавить [self clickStatusBar:self] в метод 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

1 Ответ

3 голосов
/ 29 февраля 2012

В 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. И что любопытно, и даже не работает каждый раз. Я должен бросить мяч здесь.Сожалею.Может быть, сохранить местоположение в настройках по умолчанию, когда Somone щелкает.Я думаю, что видел такое несоответствие в Cloud.app и всплывающем окне рядом с элементом статуса, и, возможно, теперь мы знаем, почему:)

...