8

NSMenuItems が動的に追加された NSMenu があります。NSMenu を開いたままにしておくと、適切に更新されません。で NSMenu update メソッドを呼び出してい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: または両方を実装することのみを想定しています。3 つすべてを実装してもあまり意味がありません。メニューをすぐに構築できる場合は、前者を実装します。メニューの構築に時間がかかる場合は、後者の 2 つを実装します。-numberOfItemsInMenu:-menu:updateItem:atIndex:shouldCancel:

最後に、これらのメソッドはすべて、「メニューが表示されようとしているときに」呼び出されると文書化されています。メニューが開いている間、それらが繰り返し呼び出されないことに、私はそれほど驚かない。

メニューを更新する必要があることがわかっている場合は、呼び出しを試すことができます-[NSMenu update]。これにより、デリゲート メソッドが呼び出される可能性があります。デリゲートが呼び出されるのを待たずに、メソッドを呼び出してメニューを変更するNSMenuこともできると確信しています。NSMenuItem

于 2012-04-13T10:27:27.177 に答える