2016-10-09 5 views
8

私はDay-Oと呼ばれる簡単なカレンダーメニューバーウィジェットを書きました。カレンダーは、NSStatusItemに追加されたNSMenuのNSMenuItem内のNSView内にネストされたNSDatePickerを使用します。アプリはというactivationPolicyを持っています(もともとplistの "Application is agent"ブールで設定されています)。ある時点(おそらくエル・キャピタンの更新?)カレンダーは入力に応答しなくなりました。アプリケーションが最初に起動すると、ステータスバー項目をクリックしてメニューを展開し、カレンダーとやりとりすることができ、ユーザーの入力に応じて応答します。しかし、アプリケーションが最初のフォーカスを失うと、カレンダーは入力に応答しなくなります。NSStatusBarのNSDatePicker NSSMenuItemは入力を受け取りません

私は、最初に辞任した後にアクティブにならないアプリへの問題を追跡したと思います。問題は、メニューバーの項目をクリックしたときに(NSApp.activate(ignoringOtherApps:true)を使用して)メニューを開いたときに手動でアプリをアクティブにしようとすると、そのメニューが閉じられるということです。

私はまた、NSDatePickerを最初のレスポンダにするようにウィンドウに指示しましたが、何の効果もないようです。

ステータスバーのアプリケーションがアクティブなアプリケーションでないときにNSDatePickerをメニュー項目に入れてユーザーの入力を受け入れるにはどうすればよいですか?


編集:問題(新しいMacOSのココアアプリで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に戻す必要があります。これは読み取り専用であるため、サブクラスで行うことになります。

指定したコードを実行しているテストプロジェクトで動作します。

関連する問題