2016-06-12 4 views
0

NSWindowRestoration을 지원하는 모든 OS X 응용 프로그램은 "모든 Windows 종료 및 닫기"(Option-Command Q) 메뉴 항목을 선택하여 닫을 수 있습니다. 이렇게하면 상태 복원이 비활성화되고 다음 번에 응용 프로그램을 열면 모든 창이 기본 위치가됩니다.윈도우 상태를 인코딩하지 않고 프로그래밍 방식으로 NSApp을 종료하는 방법은 무엇입니까?

메뉴 항목은 NSApplicationterminate: 메서드를 트리거합니다. 하지만 일반 "Close App"메뉴 (Command Q)도 마찬가지입니다.

어떻게 "Quit and Close All Windows"를 프로그래밍 방식으로 수행 할 수 있습니까? 정말로 모든 창을 나 혼자만 닫은 다음 terminate:으로 전화해야합니까?

두 작업 모두 동일한 terminate: 메서드에 연결되어있을 때 Apple은 마술처럼 어떻게 결정합니까?

+0

왜 종료하고 닫을 때 창을 반복하지 않습니까? –

+0

@ l' l' l ll ll ll ll ll ll ll ll 동안 관리하는 코드를 추가하는 동안 애플은 솔루션을 작동하는 간단한 방법을 호출합니다. – Klaas

답변

1

이렇게하는 데는 좋은 방법이없는 것 같습니다. Apple이 요청한 버그를 (필요한 이유에 대한 설명과 함께) 제출할 수도 있습니다.

두 작업이 동일한 terminate: 방법으로 연결된 경우 어떻게 처리해야합니까? 보낸 사람이 NSMenuItem의 인스턴스 인 경우

음, AppKit의의 분해보고, 그 -[NSApplication terminate:] 검사를 나타납니다. 존재하는 경우, userInterfaceItemIdentifier@"NSAlternateQuitMenuItem"과 같은지 점검합니다.

해당 식별자를 사용하여 더미 메뉴 항목을 만들고 발신자로 -terminate:으로 전달할 수 있습니다. 구현 세부 사항에 의존하기 때문에 언제든지 중단 될 수 있습니다.

다른 제어 요소는 시스템 환경 설정> 일반> "앱 종료시 창 닫기"설정입니다. 사용자 기본 키 NSAlternateQuitMenuItem에 해당합니다. 구현 세부 사항입니다. -terminate:을 호출 한 다음 -applicationWillTerminate: 대리자 메서드를 호출하기 전에 해당 설정을 제거 할 수있는 것으로 보입니다. (변경 사항은 응용 프로그램과 관련이 있으며 다른 응용 프로그램이나 시스템 환경 설정의 설정에는 영향을주지 않습니다.) 물론 위임 메서드 호출을 얻으려면 갑작스러운 종료가 비활성화되어 있어야합니다.

+0

NSMenuItem에 'userInterfaceItemIdentifier' 속성이 있다는 것을 몰랐습니다. 방금 Objective-C에 필요한 인터페이스 정의를 작성하여 액세스했습니다. 정말 고맙습니다! – Klaas

+0

좀 더 조사해 보니,이 식별자를 얻는 유일한 메뉴 항목입니다. 처음에는 거기에 없었지만 앱이 시작된 후 자동으로 추가되었습니다. – Klaas

+0

전체 메뉴 항목이 "처음"에 없습니다. 기본 메뉴가 설정된 경우 Cocoa에서 만듭니다. 특정 식별자를 가진이 메뉴 항목에 의존한다면 충분히 나빠질 것입니다. 확실히 식별자가있는 유일한 항목 인 것에 의존하지 마십시오. –