2012-04-13 10 views
4

私は動的に追加されたNSMenuItemsを持つNSMenuを持っています。 NSMenuが開いている間は、NSMenuが適切に更新されません。 NSEventTrackingRunLoopModesのNSMenu更新メソッドを呼び出しています。開いている間に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 

答えて

2

NSEventTrackingRunLoopModeのメニュー項目を更新すると、この問題が解決しました。

1

あなたはコードを一掃しました。ただし、-menu:updateItem:atIndex:shouldCancel:に電話することはできません。それはあなたが実装するはずのメソッドであり、フレームワークはそれを呼び出すことになっています。

また、一般的にあなただけの-menuNeedsUpdate:または-numberOfItemsInMenu:-menu:updateItem:atIndex:shouldCancel:の両方を実装するとしています。 3つすべてを実装することはあまり意味がありません。すぐにメニューを構築できる場合は、前者を実装します。メニューの作成に時間がかかる場合は、後者の2つを実装します。

最後に、これらの方法はすべて、「メニューが表示されようとしているとき」と記載されています。私はメニューが開いている間に繰り返し呼び出されていないことに大変驚くことはありません。

メニューを更新する必要がある場合は、-[NSMenu update]を呼び出すことができます。それはあなたの代理人メソッドを呼び出すためにそれを誘発するかもしれません。 NSMenuNSMenuItemのメソッドを呼び出して、代理人が呼び出されるのを待たずに、メニューを変更することもできます。

+0

'[NSMenu update]'はデリゲートメソッドを呼び出しません。私は動的にメニュー項目をタイマーに入れていて、開いている間はNSMenuは更新されません。 – Vinpai

+0

あなたのタイマーに応じて ' - [NSMenu addItem:]'や ' - [NSMenuItem setTitle:]'を呼び出すと更新されませんか?開いている間にメニューが更新されているのを確認したので、可能です。 –

+0

@KenThomases最初のパーティのOSクロックがそれを行います(秒を表示すると、より顕著になります)。 –

6

タイマーでメニュー項目を動的に入力していて、開いている間にNSMenuが更新されません。

それぞれの実行モードでタイマー火を持っていることを確認してください:

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

あなたが唯一それが今NSDefaultRunLoopModeに発砲ている可能性があります。

+1

私はNSRunLoopCommonModesを使用しようとしましたが、開いている間にメニューを更新しています。 – Vinpai

-1

通常のメニューではライブアップデートができない場合があります。これはNSMenuよりJGMenuWindowのメリットとして挙げられます。

+0

組み込みのNSMenuメソッドを使用してこれを達成する方法はありますか? – Vinpai

関連する問題