在显示主机菜单时更新 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的主要内容,如果未能解决你的问题,请参考以下文章

滚动网站内容或到达特定div时如何更新菜单

显示时更新 RESideMenu 中的 tableview 数据

Jquery 1.12.4 更新后点击顶部下拉菜单打开

kvm切换器怎么切换?

NSMenuItem 中的 NSProgressIndicator 未在第二次显示时更新

Suitescript 2.0-如何显示字段并基于下拉菜单更新值?