问题
I have an NSMenuItem
that I need to update to show a progress (like Time machine does with it's backup). The problem is that when I set a new title
on that NSMenuItem
and the title
is not changing.
It is in fact changing when I close and reopen the menu, but I want to update it while the user is looking at it.
I also tried remove an item and re-inserting it with no result.
Any pointers?
回答1:
This actually works with no additional effort if your updating code runs in the run loop mode which is used during menu tracking. This is NSEventTrackingRunLoopMode
, but you probably just want to use NSRunLoopCommonModes
so the menu item title is correct when the menu is pulled down.
Here's a simple example of a menu item foo
that counts the number of seconds since the app launched:
- (void)doStuff;
{
static int i = 0;
[foo setTitle:[NSString stringWithFormat:@"%d", ++i]];
}
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification;
{
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:
[self methodSignatureForSelector:@selector(doStuff)]];
[invocation setTarget:self];
[invocation setSelector:@selector(doStuff)];
[[NSRunLoop mainRunLoop] addTimer:[NSTimer timerWithTimeInterval:1 invocation:invocation repeats:YES] forMode:NSRunLoopCommonModes];
}
来源:https://stackoverflow.com/questions/6301338/update-nsmenuitem-while-the-host-menu-is-shown