난 당신이 NSApp의 -beginSheet:modalForWindow:modalDelegate:didEndSelector:contextInfo:
방법을 사용하는 가정합니다. 그렇다면 이미 메뉴 명령을 수행 할 수 있어야합니다. 이 메서드는 지정된 창에 대해서만 시트 모달을 실행합니다 (전체 응용 프로그램의 모달과 반대). 그러나 NSApp의 -runModalForWindow:
으로 전화를 걸면 전체 앱의 모달이됩니다. 그래서 당신이 그것을 부르지 않는다고 가정하면, 시트가 보여 질 때 다른 창과 메뉴 명령이 잘 작동해야합니다.
그러나 '종료'메뉴 항목은 예외입니다. 창을 활성화하는 모달 세션이 있기 때문에 종료 할 수 없습니다. 응용 프로그램을 종료하기 전에 처리해야한다고 가정합니다. 이것이 실제로하려는 경우, 가능한 해결책은 NSApplication
을 서브 클래스 화하고 그 -terminate:
메소드를 우선 적용하여 시트를 닫습니다 (열려있는 경우). 먼저, 서브 클래스를 NSApplication
으로 만들고 앱에 'MainMenu.xib'와 'Info.plist'의 Principal Class
으로 설정하여 사용하도록합니다. 그런 다음 하위 클래스에 다음과 같이 추가하십시오.
- (void)terminate:(id)sender
{
// First close the sheet (if it's active), using whatever method
// you have set up to do this...
[((MyAppDelegate*)[self delegate]) closeSheet:self];
// Now call the normal implementation
[super terminate:sender];
}