1

我在系统菜单栏中有一个状态项,单击它时会出现一个弹出框。我想让弹出框在应用程序首次启动时自动出现。我试图将其添加[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

4

1 回答 1

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 中看到了这种不一致,并且在状态项旁边有一个弹出框,也许现在我们知道为什么了 :)

于 2012-02-29T18:18:05.423 回答