2012-04-13 25 views
4

Ich habe ein NSMenu mit dynamisch hinzugefügten NSMenuItems. Das NSMenu wird nicht ordnungsgemäß aktualisiert, während es geöffnet bleibt. Ich rufe NSMenu Update-Methode in NSEventTrackingRunLoopModes.Wie aktualisiere ich NSMenu, während es geöffnet ist?

Ich habe folgende Methoden implementiert, um NSMenu zu aktualisieren.

- (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 

Antwort

2

Das Aktualisieren der Menüoptionen in NSEventTrackingRunLoopMode löste dieses Problem.

1

Sie haben eine Reihe des Codes weggelassen. Sie sollten jedoch nicht -menu:updateItem:atIndex:shouldCancel: anrufen. Das ist eine Methode, die Sie implementieren sollten, und das Framework soll sie aufrufen.

Auch du bist, in der Regel nur vermuten, entweder-menuNeedsUpdate:oder beide -numberOfItemsInMenu: und -menu:updateItem:atIndex:shouldCancel: zu implementieren. Die Umsetzung aller drei ergibt wenig Sinn. Sie implementieren die erstere, wenn Sie das Menü sofort erstellen können. Sie implementieren die beiden letzteren, wenn das Erstellen des Menüs einige Zeit in Anspruch nehmen wird.

Schließlich werden alle diese Methoden dokumentiert als "wenn ein Menü angezeigt werden soll". Ich bin nicht sehr überrascht, dass sie nicht wiederholt aufgerufen werden, solange das Menü geöffnet ist. Wenn Sie wissen, dass das Menü aktualisiert werden muss, können Sie versuchen, -[NSMenu update] aufzurufen. Das kann dazu führen, dass Sie Ihre Delegiertenmethoden aufrufen. Ich bin mir ziemlich sicher, dass Sie auch einfach die Methoden NSMenu und NSMenuItem aufrufen können, um das Menü zu ändern, ohne darauf zu warten, dass Ihr Delegat aufgerufen wird.

+0

'[NSMenu update]' ruft keine Delegiertenmethoden auf. Ich bearbeite Menüelemente dynamisch in einem Timer und NSMenu wird nicht aktualisiert, während es geöffnet ist. – Vinpai

+0

Es wird nicht aktualisiert, selbst wenn Sie Dinge wie '- [NSMenu addItem:]' oder '- [NSMenuItem setTitle:]' als Antwort auf Ihren Timer aufrufen? Ich bin sicher, ich habe gesehen, Menüs zu aktualisieren, während sie geöffnet sind, so ist es möglich. –

+0

@KenThomases Die erste Party-OS-Uhr macht das (es ist auffälliger, wenn Sie Sekunden anzeigen). –

6

Ich bearbeite Menüelemente in einem Timer dynamisch und NSMenu aktualisiert nicht, während es geöffnet ist.

Achten Sie darauf, den Timer Feuer auf dem jeweiligen Betriebsmodus haben:

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

Sie es nur auf NSDefaultRunLoopMode jetzt Feuer haben könnte.

+1

Ich habe versucht mit NSRunLoopCommonModes, aber immer noch bekomme ich Menü-Update-Problem, während es geöffnet ist – Vinpai

-1

Die Live-Aktualisierung ist möglicherweise mit einem normalen Menü nicht möglich. Es wird als ein Vorteil von JGMenuWindow über NSMenu aufgeführt.

+0

Ist eine Möglichkeit, dies mit integrierten NSMenu-Methoden zu erreichen? – Vinpai