2016-12-27 95 views
4

我有一個狀態欄應用程序,它在菜單欄中運行。因此,我在info.plst中將Application is agent (UIElement)設置爲true。這導致我的應用程序沒有停靠圖標和菜單欄。macOS菜單欄應用程序:主菜單未顯示

但是,我也有一個首選窗口,用戶可以從狀態欄菜單打開。這是我如何打開它:

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

窗口顯示爲預期,但應用程序與文件編輯等主菜單欄,顯示不出來。只有當我點擊另一個應用程序並回到我的應用程序時,菜單欄纔會顯示。

我注意到,如果我在info.plst值更改爲falseapplicationDidFinishLaunching()使用NSApp.setActivationPolicy(.accessory),它具有相同的效果。但是,如果在applicationDidFinishLaunching()被調用後的幾毫秒時間內,我用NSApp.setActivationPolicy(.accessory)調用了一個定時器,它會起作用,主菜單按預期顯示。然而,這具有副作用,應用程序圖標在碼頭中彈出幾秒鐘(直到定時器被觸發),這不是一個好的用戶體驗。

有沒有人有一個想法我還能嘗試什麼?當我切換活動的應用程序時發生了什麼,我沒有在代碼中做什麼?

我使用在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) 
     } 
    } 

這不是一個完美的解決方案。如果我找不到更好的解決方案,我會提交一個錯誤。