2016-12-27 7 views
4

У меня есть приложение состояния, которое выполняется в строке меню. Поэтому я установил Application is agent (UIElement) в true в info.plst. Это приводит к отсутствию значка док-станции и панели меню для моего приложения.приложение macOS menubar: главное меню не отображается

Однако у меня также есть окно предпочтений, которое пользователь может открыть из меню состояния. Вот как я его открыть:

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

окно показывает, как ожидалось, но в основном меню приложения с Файл, Edit и так далее, не появляется. Только если я нажму на другое приложение и вернусь в свое приложение, отобразится меню.

Я заметил, что если я изменить значение в info.plst для false и использовать NSApp.setActivationPolicy(.accessory) в applicationDidFinishLaunching(), он имеет тот же результат. Однако, если я вызываю NSApp.setActivationPolicy(.accessory) с таймером за несколько миллисекунд после вызова applicationDidFinishLaunching(), он работает, и главное меню отображается, как ожидалось. Это, однако, имеет побочный эффект, что значок приложения появляется на доке в течение нескольких секунд (пока не запущен таймер), что не очень приятно.

Есть ли у кого-нибудь идеи, что еще я мог попробовать? Что происходит при переключении активного приложения, которое я не делаю в коде?

Я использую версию 8.2.1 (8C1002) на MacOS 10.12.2 (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) 
     } 
    } 

Это не идеальное решение. Если я не найду лучшего решения, я напишу ошибку.

 Смежные вопросы

  • Нет связанных вопросов^_^