2010-05-19 4 views
1

창을 포함하는 펜촉 (winA.xib)이 있습니다. 내 응용 프로그램 대리인은 WinAController라는 NSWindowController 하위 클래스를 포함합니다.MainMenu에서 특정 메뉴 항목 가져 오기

WinAController에는 MainMenu를 가리키는 속성 (NSMenu * mainMenu)이 있습니다.

WinAController = [[WinAController alloc] initWithWindowNibName:@"WinA"]; 
    WinAController.mainMenu = [NSApp mainMenu]; 

은 내가 [WinAController이 ShowWindow] 메소드를 호출 위나을 표시 MAINMENU의 "창"최상위 메뉴 항목 아래에있는 메뉴 항목이 :이 코드 WinAController를 인스턴스화 한 후 나는 그것을 설정했습니다. WinA가 표시되는지 여부에 따라이 메뉴 항목의 켜짐/꺼짐 상태를 토글합니다. WinAController에는 또 다른 속성 (NSMenuItem * myMenuItem)이 있습니다.

"윈도우"최상위 메뉴 항목의 하위 메뉴에 대한 참조를 얻으려면 어떻게해야합니까? 하위 메뉴 항목의 제목은 "Command"입니다. 나는 이것을 시도했다 :

if (mainMenu != nil) { 
    myMenuItem = [mainMenu itemAtIndex:[mainMenu indexOfItemWithTitle:@"Command"]]; 
} 

그러나 그것은 작동하지 않는다.

어디로 잘못 가고 있습니까?

감사합니다,

편집 : 지금 mainMenu.xib에 WinAController에 놓여있다. 나는 WinA (winA.xib에서) 파일의 소유자를 WinAController 클래스로 설정했다. 그러나 다른 닙에 있기 때문에 WinAController의 창 IBOutlet을 WinA에 연결하는 방법을 알 수 없다!

답변

1

I을 윈도우 컨트롤러를 MainMenu.xib에 넣으라고 했습니까?

오, 아무것도 모험하지 않고 얻은 것도 없습니다.

@interface MyApplicationDelegate : NSObject { 
    IBOutlet NSMenuItem *winAMenuItem; 
} 

@property(assign) IBOutlet NSMenuItem *winAMenuItem; 

@end 

그런 다음 윈도우 컨트롤러 만 리스폰 더 체인의 수 (그래서 유효성을 검사 할 수 없습니다 [[NSApp delegate] winAMenuItem];

+0

저는 파일을 열람하기가 매우 쉽습니다. 지금까지 해본 결과 많은 것들이 프로그래밍 방식으로 만들어졌습니다. IB에서 커스텀 NSWindowController를 만드는 것에 대해서는 확신이 없습니다. 아마도 지금 다시 생각할 것입니다. 실제로 IB 코드는 때때로 Xcode보다 복잡합니다! – Garry

+0

제쳐두고, 윈도우 콘센트에 창 콘센트를 연결하고 MainMenu.nib에 메뉴 항목 콘센트를 연결합니다. –

3

메인 닙의 IBOutlet을 통해 직접 메뉴 항목에 대한 참조를 저장할 수 있습니다.

또는 (더 IMO), 당신은 WinAController에서 -validateMenuItem:을 구현할 수 거기 (사용자가 실제로도 그것을 볼 때, 국가는 설정되는 방식) 상태를 설정합니다

- (BOOL)validateMenuItem:(NSMenuItem *)item { 
    if ([item action] == @selector(showWindow:)] 
     [item setState:[winA isVisible] ? NSOnState : NSOffState]; 

    return YES; 
} 
+0

통해 액세스 할 수 있습니다 : 당신은 물론, 수행 할 작업은 다음과 같다 메뉴 항목) 창이 활성화되면? 창을 숨기면 창 컨트롤러가 유효성 검사 메시지를받지 못하게되어 해당 메서드가 해당 상태를 반영하도록 메뉴 항목을 다시 구성 할 수 없게됩니다. –

+0

메뉴 항목의 대상이 문제의 객체 인 경우 IIRC가 아닙니다. 항목이 첫 번째 응답자를 대상으로하는 경우 그래도 중단됩니다. 나는 다시 확인해야합니다 ... – Wevah

+0

그래, 내가 말한 것은 메뉴 항목이 첫 번째 응답자를 대상으로 할 때만 적용됩니다. 창 컨트롤러를 직접 타겟으로한다면 예, 작동합니다. –

관련 문제