2012-04-13 4 views
4

동적으로 NSMenuItems가 추가 된 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:으로 전화하지 않아도됩니다. 이것은 구현해야하는 메소드이고 프레임 워크는이를 호출해야합니다.

또한, 일반적으로 만 -numberOfItemsInMenu:-menu:updateItem:atIndex:shouldCancel:중 하나 -menuNeedsUpdate: 또는 모두를 구현하기 위해 생각하고 있습니다. 세 가지 모두를 구현하는 것은별로 의미가 없습니다. 메뉴를 즉시 작성할 수 있다면 전자를 구현하십시오. 메뉴를 작성하는 데 시간이 걸리는 경우 두 가지를 구현하십시오.

마지막으로 모든 메서드는 "메뉴를 표시하려고 할 때"라고 설명되어 있습니다. 나는 그들이 메뉴가 열려있는 동안 반복적으로 호출되지 않는다는 것에 놀랍지 않게 생각한다.

메뉴를 업데이트해야한다고 판단되면 -[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를 사용해 보았지만 열 때 Menu를 새로 고침하는 중임 – Vinpai

-1

일반 메뉴에서는 실시간 업데이트가 불가능할 수 있습니다. NSMenu를 통해 JGMenuWindow의 장점으로 나열됩니다.

+0

내장 된 NSMenu 메서드를 사용하여이 작업을 수행하는 방법은 무엇입니까? – Vinpai