我有一个状态栏项目,可以弹出一个 NSMenu,并且我有一个委托集,并且它已正确连接(-(void)menuNeedsUpdate:(NSMenu *)menu
工作正常)。也就是说,该方法设置为在显示菜单之前调用,我需要监听该方法并触发异步请求,稍后在菜单打开时更新菜单,但我不知道应该如何完成。
谢谢 :)
EDIT
好的,我现在在这里:
当您单击菜单项(在状态栏中)时,将调用一个运行 NSTask 的选择器。我使用通知中心来侦听该任务何时完成,然后编写:
[[NSRunLoop currentRunLoop] performSelector:@selector(updateTheMenu:) target:self argument:statusBarMenu order:0 modes:[NSArray arrayWithObject:NSEventTrackingRunLoopMode]];
并有:
- (void)updateTheMenu:(NSMenu*)menu {
NSMenuItem *mitm = [[NSMenuItem alloc] init];
[mitm setEnabled:NO];
[mitm setTitle:@"Bananas"];
[mitm setIndentationLevel:2];
[menu insertItem:mitm atIndex:2];
[mitm release];
}
这个方法肯定会被调用,因为如果我单击菜单并立即返回菜单,我会得到一个包含此信息的更新菜单。问题是,当菜单打开时,它不会更新。
菜单鼠标跟踪是在特殊的运行循环模式下完成的(NSEventTrackingRunLoopMode
)。为了修改菜单,您需要发送一条消息,以便在事件跟踪模式下对其进行处理。最简单的方法是使用以下方法NSRunLoop
:
[[NSRunLoop currentRunLoop] performSelector:@selector(updateTheMenu:) target:self argument:yourMenu order:0 modes:[NSArray arrayWithObject:NSEventTrackingRunLoopMode]]
您还可以将模式指定为NSRunLoopCommonModes
并且该消息将在任何常见的运行循环模式下发送,包括NSEventTrackingRunLoopMode
.
然后你的更新方法将执行如下操作:
- (void)updateTheMenu:(NSMenu*)menu
{
[menu addItemWithTitle:@"Foobar" action:NULL keyEquivalent:@""];
[menu update];
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)