Menu mouse tracking is done in a special run loop mode (NSEventTrackingRunLoopMode
). In order to modify the menu, you need to dispatch a message so that it will be processed in the event tracking mode. The easiest way to do this is to use this method of NSRunLoop
:
[[NSRunLoop currentRunLoop] performSelector:@selector(updateTheMenu:) target:self argument:yourMenu order:0 modes:[NSArray arrayWithObject:NSEventTrackingRunLoopMode]]
You can also specify the mode as NSRunLoopCommonModes
and the message will be sent during any of the common run loop modes, including NSEventTrackingRunLoopMode
.
Your update method would then do something like this:
- (void)updateTheMenu:(NSMenu*)menu
{
[menu addItemWithTitle:@"Foobar" action:NULL keyEquivalent:@""];
[menu update];
}