2016-10-09 5 views
8

잠시 뒤로 Day-O이라는 간단한 캘린더 메뉴 막대 위젯을 작성했습니다. 달력은 NSStatusItem에 추가 된 NSMenu의 NSMenuItem 안의 NSView 안에 중첩 된 NSDatePicker를 사용합니다. 앱의 activationPolicy는 .accessory입니다 (원래 plist의 'Application is agent'bool을 통해 설정 됨). 어느 시점에서 (아마도 El Capitan 업데이트로?) 달력이 입력에 응답하지 않습니다. 앱이 처음 실행되면 상태 표시 줄 항목을 클릭하여 메뉴를 확장하고 캘린더와 상호 작용할 수 있으며 예상대로 사용자 입력에 응답합니다. 그러나 응용 프로그램이 초기 포커스를 잃으면 달력은 입력에 응답하지 않습니다.NSStatusBar의 NSDatePicker NSSMenuItem이 입력을받지 못합니다

저는 처음에 사임 한 후 활성화하지 않는 문제를 앱에서 추적했다고 생각합니다. 메뉴 막대 항목을 클릭 할 때 (NSApp.activate(ignoringOtherApps:true) 사용) 수동으로 응용 프로그램을 활성화하려고하면 방금 연 메뉴가 닫히는 문제가 있습니다.

또한 NSDatePicker를 첫 번째 응답자로 만들려고했는데 아무 효과가없는 것 같습니다.

NSDatePicker를 상태 표시 줄 앱이 활성 앱이 아닌 경우 사용자 입력을 허용하도록 메뉴 항목에 어떻게 가져 옵니까?


편집 : 문제 (새로운 맥 OS 코코아 응용 프로그램에 AppDelegate에이 추가) 설명하기 간단한 코드 :

let statusItem = NSStatusBar.system().statusItem(withLength:NSVariableStatusItemLength) 
func applicationDidFinishLaunching(_ aNotification: Notification) { 
    NSApp.setActivationPolicy(.accessory) 

    statusItem.button?.title = "Calendar" 

    let menu = NSMenu() 
    let item = NSMenuItem() 
    let picker = NSDatePicker(frame: NSRect(x: 0, y: 0, width: 140, height: 148)) 
    picker.datePickerStyle = .clockAndCalendarDatePickerStyle 

    item.view = picker 
    menu.addItem(item) 

    statusItem.menu = menu 
} 

시작 응용 프로그램을 메뉴 항목을 클릭하고 주위를 클릭합니다 달력. 그런 다음 다른 앱을 클릭 한 다음 메뉴 항목을 다시 클릭하십시오. 캘린더는 더 이상 클릭에 응답하지 않습니다.

+0

이제 하위 레벨 "이벤트 탭"API를 사용하면 상태 입력란에 들어가기 전에 마우스 입력을 차단하여 메뉴를 열기 전에 앱을 활성화 할 수 있는지 궁금합니다. –

답변

5

NSDatePicker는 "acceptsFirstMouse"를 true로 반환해야합니다. 읽기 전용이므로 하위 클래스에서 처리해야합니다.

제공 한 코드를 실행하는 테스트 프로젝트에서 작동합니다.