2016-12-27 7 views
4

私はメニューバーで実行されるステータスバーアプリケーションを持っています。したがって、をinfo.plsttrueに設定しました。ドックアイコンがなく、アプリケーション用のメニューバーも表示されません。macOSメニューバーアプリケーション:メインメニューが表示されない

しかし、ユーザーがステータスバーメニューから開くことができる設定ウィンドウもあります。ここで私はそれを開く方法です:

if (!NSApp.setActivationPolicy(.regular)) { 
    print("unable to set regular activation policy") 
} 
NSApp.activate(ignoringOtherApps: true) 
if let window = preferencesWindowController.window { 
    window.makeKeyAndOrderFront(nil) 
} 

ウィンドウが期待通りに現れたが、ファイルとアプリケーションのメインメニューバー、編集というように、表示されません。私が別のアプリをクリックして私のアプリに戻った場合にのみ、メニューバーが表示されます。

私はfalseinfo.plstの値を変更し、applicationDidFinishLaunching()NSApp.setActivationPolicy(.accessory)を使用する場合、それは同じ結果を持っていること、気づきました。しかし、applicationDidFinishLaunching()が呼び出された後、私がNSApp.setActivationPolicy(.accessory)に数ミリ秒タイマーをかけて呼び出すと、それは動作し、メインメニューが期待通りに表示されています。しかしこれは、アプリアイコンがDockに数秒間ポップアップする(タイマーが起動されるまで)という副作用があります。これは素晴らしいユーザーエクスペリエンスではありません。

他に誰が私が試みることができるアイデアはありますか?アクティブなアプリケーションを切り替えると、私はコードでやっていないのですが、何が起こっていますか?

私はMacOSの10.12.2のバージョン8.2.1(8C1002)(16C67)

感謝を使用しています!私は別のアプリをクリックして、私のアプリに戻ってくる場合は、メニューバーが表示されている、質問に書いたように

+0

"期待どおりのウィンドウが表示されます。"また、ウィンドウが最初のレスポンダになり、バックグラウンドなどのように見えないと仮定します。正しい? – idmean

+0

それは正しいです。 – Daniel

+0

私のアプリでもこの問題に遭遇しました。あなたは一人じゃない :) – Bob

答えて

0

これが今の私の回避策ソリューションです。設定ウィンドウを表示しようとすると、これをシミュレートしています。

NSApp.setActivationPolicy(.regular) 
    NSApp.activate(ignoringOtherApps: true) 
    window.makeKeyAndOrderFront(nil) 

    if (NSRunningApplication.runningApplications(withBundleIdentifier: "com.apple.dock").first?.activate(options: []))! { 
     let deadlineTime = DispatchTime.now() + .milliseconds(200) 
     DispatchQueue.main.asyncAfter(deadline: deadlineTime) {     
     NSApp.setActivationPolicy(.regular) 
      NSApp.activate(ignoringOtherApps: true) 
     } 
    } 

これは完璧な解決策ではありません。より良い解決策が見つからない場合は、バグを報告します。

関連する問題