如何在NSMenu打开时更新它?

时间:2012-04-13 07:13:26

标签: objective-c cocoa nsmenuitem nsmenu nsstatusbar

我有一个动态添加NSMenuItems的NSMenu。 NSMenu在保持打开状态时不能正常刷新。我在NSEventTrackingRunLoopModes中调用NSMenu更新方法。

我已经实现了以下方法来更新NSMenu。

- (void)menuNeedsUpdate:(NSMenu *)menu {
for (NSInteger index = 0; index < count; index++)
    [self menu:menu updateItem:[menu itemAtIndex:index] 
                       atIndex:index 
                  shouldCancel:NO];
}

- (BOOL)menu:(NSMenu *)menu updateItem:(NSMenuItem *)item atIndex:(NSInteger)index shouldCancel:(BOOL)shouldCancel`

- (NSInteger)numberOfItemsInMenu:(NSMenu *)menu

4 个答案:

答案 0 :(得分:6)

  

我在计时器中动态填充菜单项,NSMenu在打开时不会更新。

确保在相应的运行模式下启动计时器:

[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

你现在可能只在NSDefaultRunLoopMode点击它。

答案 1 :(得分:2)

更新NSEventTrackingRunLoopMode中的菜单项解决了这个问题。

答案 2 :(得分:1)

你遗漏了一堆代码。但是,您不应该致电-menu:updateItem:atIndex:shouldCancel:。这是一个你应该实现的方法,框架应该调用它。

此外,通常您只想实现 <{em> -menuNeedsUpdate: -numberOfItemsInMenu:-menu:updateItem:atIndex:shouldCancel:。实施这三者并没有多大意义。如果可以立即构建菜单,则实现前者。如果构建菜单需要一些时间,则实现后两种。

最后,所有这些方法都被记录为“当菜单即将显示时”。当菜单打开时,我并没有反复打电话,我感到非常惊讶。

如果您知道需要更新菜单,可以尝试调用-[NSMenu update]。这可能会激发它调用你的委托方法。我很确定你也可以调用NSMenuNSMenuItem上的方法来修改菜单,而无需等待你的代理被调用。

答案 3 :(得分:0)

使用常规菜单可能无法进行实时更新。它被列为JGMenuWindow优于NSMenu的优势。