2013-09-08 3 views
3

만든 NSMenuItem에서 하위 메뉴를 요구하지 NSMenuDelegate. 이 대리자는 몇 가지 요소를 기반으로 메뉴를 동적으로 업데이트합니다. 내가 전화를이 방법으로 적절한 시간에 다음과 같은는 나는 대리인이있는 NSMenu와 함께 NSStatusItem이 다른 NSMenuDelegate

- (BOOL)menu:(NSMenu *)menu updateItem:(NSMenuItem *)item atIndex:(NSInteger)index shouldCancel:(BOOL)shouldCancel; 

:

NSMenu *submenu = [[NSMenu alloc] init]; 
SomeSubmenuDelegate *submenuDelegate = [[SomeSubmenuDelegate alloc] init]; 
submenu.delegate = submenuDelegate; 
item.submenu = submenu; 

상태 메뉴가 올바르게 표시하고,이 문서에 따라 신속하게 메뉴를 업데이트 그래서, 나는 방법을 사용 해당 메뉴 항목에는 하위 메뉴에 대한 공개 삼각형이 있습니다. 그러나, 하위 메뉴는 해당 항목이 SomeSubmenuDelegate에 다음과 같은 방법은 세 개의 빈 메뉴 항목을 표시해야합니다 내 경험을 바탕으로 어떤 존재에도 불구하고, 강조 표시 할 때 나타나지 않습니다 :

- (NSInteger)numberOfItemsInMenu:(NSMenu *)menu 
{ 
    return 3; 
} 

로깅뿐만 아니라 아무것도하지하지 않습니다 심지어는 menuWillOpen에서 메서드가 호출되지 않으므로 대리자가 설정되지 않았거나 메뉴가 런타임 중에 복사되고 대리자가 프로세스에서 설정되지 않은 것으로 믿게됩니다 ...

현재 해결 방법은 다음과 같습니다. NSMenuDelegate (NSStatusItem 메뉴 용)의 전체 하위 메뉴를 대리자를 지정하는 대신 생성하십시오. 이 몇 가지 단점이 여기에 있습니다

1) 나는 NSMenuDelegate 내에서 내 행동을 유지하고, 그리고 부모와 하위 메뉴에 대해 별도의 파일이 좋을 것이다. 반드시 중요하지, 즉이 모든 필요한 전에 각 하위 메뉴 NSMenuItem에 대한 메모리를 할당하고 있음을 의미하는 동안

2).

내가 다른 모든 NSMenu와 마찬가지로 여기 대리자를 사용할 수 있어야 최적으로 보인다.

모든 의견/제안은 대단히 감사하겠습니다. 여기에 나와있는 첫 번째 질문!

편집 : ARC 때문에입니까? 나는 규칙에 따라 ARC가 가비지 콜렉션 측면에서 생각할 때 대리인 객체를 유지할 것이라고 잘못 생각했을 수도 있지만 대리인은 약한 참조이고 ARC는 그런 가정을하지 않기 때문에 아마도 공개 될 것입니다. 가비지 수집은 강력한 참조를 유지한다고 말하는 Apple docs의 가비지 수집에 대한 참조 만 찾을 수 있었지만 분명히 ARC는 가비지 수집이 아니며 이에 대한 정보를 찾을 수 없습니다. 이것은 부모 대리자에 대리인을 유지해야한다는 것을 의미하며 이는 매우 역동적 인 것으로 추악합니다. ARC에서 대리인을 유지 한 다음 부모 대리인 (또는 해당되는 다른 사람)의 참조없이 적절한 시간에 공개 할 수 있습니까? 제 경우

답변

0

난 멤버 변수에있어서 메뉴 내에서 인스턴스의 선언을 옮겼다.

@implementation MyView{ 
    MyMenu *myMenu; 
} 
-(void)awakeFromNib{ 
    ... 
    myMenu = [[MyMenu alloc]init]; 

    [self setMenu:[myMenu createMenuStructure]]; 

방법에

-(void)awakeFromNIb{ 
.. 
[self setMenu:[[MyMenu alloc] init]]; 

에서

'createMenuStructure는'로컬 내 메뉴를 만들었습니다. 'MyMenu'는 NSMenuDelegate를 구현합니다.

이 강한 기준으로 내 메뉴 변수를 유지한다. 핸들러는 이제 완벽하게 작동합니다.