【发布时间】:2011-09-12 04:20:32
【问题描述】:
我有一个NSMenuItem,我需要更新它以显示进度(就像 Time machine 使用它的备份一样)。问题是当我在那个NSMenuItem 上设置一个新的title 并且title 没有改变。
当我关闭并重新打开菜单时它实际上正在改变,但我想在用户查看它时更新它。
我还尝试删除一个项目并重新插入它,但没有结果。
任何指针?
【问题讨论】:
标签: cocoa macos nsmenuitem
我有一个NSMenuItem,我需要更新它以显示进度(就像 Time machine 使用它的备份一样)。问题是当我在那个NSMenuItem 上设置一个新的title 并且title 没有改变。
当我关闭并重新打开菜单时它实际上正在改变,但我想在用户查看它时更新它。
我还尝试删除一个项目并重新插入它,但没有结果。
任何指针?
【问题讨论】:
标签: cocoa macos nsmenuitem
如果您的更新代码在菜单跟踪期间使用的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];
}
【讨论】:
NSDefaultRunLoopMode 上运行的 performSelector:afterDelay: 来做到这一点。非常感谢您的回答。