Cocoa 显示主机菜单时更新NSMenuItem
我有一个Cocoa 显示主机菜单时更新NSMenuItem,cocoa,macos,nsmenuitem,Cocoa,Macos,Nsmenuitem,我有一个NSMenuItem,我需要更新它以显示进度(就像时间机器的备份一样)。问题是,当我在NSMenuItem上设置新的title时,title没有改变 事实上,当我关闭并重新打开菜单时,它正在改变,但我想在用户查看菜单时更新它 我还尝试删除一个项目并重新插入,但没有结果 有任何指针吗?如果您的更新代码在菜单跟踪过程中使用的中运行,那么这实际上不需要额外的工作。这是NSEventTrackingRunLoopMode,但您可能只想使用NSRunLoopCommonModes,以便在下拉菜单时
NSMenuItem
,我需要更新它以显示进度(就像时间机器的备份一样)。问题是,当我在NSMenuItem
上设置新的title
时,title
没有改变
事实上,当我关闭并重新打开菜单时,它正在改变,但我想在用户查看菜单时更新它
我还尝试删除一个项目并重新插入,但没有结果
有任何指针吗?如果您的更新代码在菜单跟踪过程中使用的中运行,那么这实际上不需要额外的工作。这是
NSEventTrackingRunLoopMode
,但您可能只想使用NSRunLoopCommonModes
,以便在下拉菜单时菜单项标题正确
下面是一个简单的菜单项foo
示例,用于计算应用程序启动后的秒数:
- (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];
}
非常有价值的回答。这是人们第一次遇到菜单runloop时遇到的一个非常常见的问题。你完全正确,Nicholas尝试使用
performSelector:afterDelay:
,它在NSDefaultRunLoopMode
上运行。非常感谢你的回答。