需要在awakeFromNib期间显示NSPopover吗?

时间:2012-02-29 18:02:50

标签: objective-c nsstatusitem nspopover awakefromnib

我在系统菜单栏中有一个状态项,在单击时会显示一个弹出窗口。我想在首次启动应用程序时自动显示弹出窗口。我尝试将[self clickStatusBar:self]添加到a​​wakeFromNib方法,但它不起作用。有谁知道如何做到这一点?

以下是我目前的方法:

- (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 个答案:

答案 0 :(得分: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。 奇怪的是,每次都没有工作。我必须把球扔到这里。抱歉。当somone点击时,可能会将位置保存在默认值中。我想我在Cloud.app中看到了这样的不一致,并且在状态项旁边有一个popover,现在我们可能知道原因了:)