8

しばらく前に、 Day-Oという単純なカレンダー メニュー バー ウィジェットを作成しました。カレンダーは、NSStatusItem に追加された NSMenu の NSMenuItem 内の NSView 内にネストされたストック NSDatePicker を使用します。.accessoryアプリには、 (最初は plist の "Application is agent" ブール値を介して設定された)の activationPolicy があります。ある時点で (おそらく El Capitan の更新で?) カレンダーが入力に応答しなくなりました。アプリを最初に起動すると、ステータス バーの項目をクリックしてメニューを展開し、カレンダーを操作すると、期待どおりにユーザー入力に応答します。しかし、アプリケーションが最初のフォーカスを失うと、カレンダーは入力に応答しなくなります。

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

また、ウィンドウに NSDatePicker を最初の応答者にするように指示しようとしましたが、それも効果がないようです。

ステータスバーアプリがアクティブなアプリではない場合、メニュー項目で NSDatePicker を取得してユーザー入力を受け入れるにはどうすればよいですか?


編集:問題を説明するための最も単純なコード (これを新しい macOS Cocoa アプリの 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
}

アプリを起動し、メニュー項目をクリックして、カレンダーの周りをクリックします。次に、別のアプリをクリックしてから、もう一度メニュー項目をクリックします。カレンダーがクリックに反応しなくなりました。

4

1 に答える 1

6

NSDatePicker は "acceptsFirstMouse" を true (読み取り専用) として返す必要があるため、サブクラスでそれを行う必要があります。

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

于 2016-10-10T13:41:37.550 に答える