我在系统菜单栏中有一个状态项,在单击时会显示一个弹出窗口。我想在首次启动应用程序时自动显示弹出窗口。我尝试将[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
答案 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,现在我们可能知道原因了:)