我有一个动态添加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
答案 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]
。这可能会激发它调用你的委托方法。我很确定你也可以调用NSMenu
和NSMenuItem
上的方法来修改菜单,而无需等待你的代理被调用。
答案 3 :(得分:0)
使用常规菜单可能无法进行实时更新。它被列为JGMenuWindow优于NSMenu的优势。