8

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

我已经实现了以下方法来更新 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

3 回答 3

7

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

于 2014-03-16T17:03:05.980 回答
5

我在计时器中动态填充菜单项,并且 NSMenu 在打开时没有更新。

确保在相应的运行模式下触发计时器:

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

你可能现在才开火NSDefaultRunLoopMode

于 2012-04-13T14:50:11.527 回答
0

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

此外,通常您只假设实现和中的一个 -menuNeedsUpdate: 两个。实现所有三个没有多大意义。如果您可以立即构建菜单,则可以实施前者。如果构建菜单需要一些时间,您可以实现后两者。-numberOfItemsInMenu:-menu:updateItem:atIndex:shouldCancel:

最后,所有这些方法都被记录为“当菜单即将显示时”。在菜单打开时他们没有被重复调用,我并不感到非常惊讶。

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

于 2012-04-13T10:27:27.177 回答