【问题标题】:Update NSMenuItem while the host menu is shown在显示主机菜单时更新 NSMenuItem
【发布时间】:2011-09-12 04:20:32
【问题描述】:

我有一个NSMenuItem,我需要更新它以显示进度(就像 Time machine 使用它的备份一样)。问题是当我在那个NSMenuItem 上设置一个新的title 并且title 没有改变。

当我关闭并重新打开菜单时它实际上正在改变,但我想在用户查看它时更新它。

我还尝试删除一个项目并重新插入它,但没有结果。

任何指针?

【问题讨论】:

    标签: cocoa macos nsmenuitem


    【解决方案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: 来做到这一点。非常感谢您的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2019-07-16
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多