I have a statusitem in the system menu bar that makes a popover appear when it is clicked. I would like to make the popover automatically appear when the application is first launched. I tried to add the [self clickStatusBar:self] to the awakeFromNib method but it doesn’t work. Anyone know how to accomplish this?
Here are my current methods:
- (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];
}
I tried adding applicationDidFinishLaunching: as
- (void)applicationDidFinishLaunching:(NSNotification *)notification {
[self clickStatusBar:self];
}
but I get an error of
-[AppDelegate bounds]: unrecognized selector sent to instance
In
awakeFromNib:the application is not fully launched yet, only this NIB file has been unmarshalled. At this point this method gives you a hook to complete (object-local) initialization. The application is (quite likely) not ready to process events or perform actions.You should trigger that action from
applicationDidFinishLaunching:method, an optional method in the application delegate, and pass in the status item like a click would do (because you query it forbounds).Update. This is trickier than I had thought. Turns out, the NSStatusItem doesn’t have a view associated at that point when the delegate gets called. I’d venture to say that is a bug with
NSStatusItem. WhenstatusItem.viewis called inapplicationDidFinishLaunching:, the popover method receivesniland complains.The only (partial, see below) workaround that I have found is to set a button as view manually in
awakeFromNib:like so:That way you’d have a view around when the application is done launching. But beware, it doesn’t look like the default one.
PS. And curiously, and does not even work every time. I have to drop the ball here. Sorry. Maybe save the location in the defaults when somone clicks. I think I saw such an inconsistency in Cloud.app and with a popover next to a status item, and maybe now we know why 🙂