在显示主机菜单时更新 NSMenuItem
Posted
技术标签:
【中文标题】在显示主机菜单时更新 NSMenuItem【英文标题】:Update NSMenuItem while the host menu is shown 【发布时间】:2011-09-12 04:20:32 【问题描述】:我有一个NSMenuItem
,我需要更新它以显示进度(就像 Time machine 使用它的备份一样)。问题是当我在那个NSMenuItem
上设置一个新的title
并且title
没有改变。
当我关闭并重新打开菜单时它实际上正在改变,但我想在用户查看它时更新它。
我还尝试删除一个项目并重新插入它,但没有结果。
任何指针?
【问题讨论】:
【参考方案1】:如果您的更新代码在菜单跟踪期间使用的run loop mode 中运行,这实际上不需要额外的努力。这是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];
【讨论】:
非常有价值的答案。这是人们第一次遇到菜单运行循环时非常常见的问题。 你说得对 Nicholas,正试图用在NSDefaultRunLoopMode
上运行的 performSelector:afterDelay:
来做到这一点。非常感谢您的回答。以上是关于在显示主机菜单时更新 NSMenuItem的主要内容,如果未能解决你的问题,请参考以下文章
显示时更新 RESideMenu 中的 tableview 数据