NSWindow, запущенное из statusItem menuItem, не отображается как активное окно - PullRequest
0 голосов
/ 30 сентября 2008

У меня есть приложение statusItem, написанное на PyObjC. StatusItem имеет menuItem, который должен запускать новое окно при нажатии:

# Create statusItem
statusItem = NSStatusBar.systemStatusBar().statusItemWithLength_(NSVariableStatusItemLength)
statusItem.setHighlightMode_(TRUE)
statusItem.setEnabled_(TRUE)
statusItem.retain()

# Create menuItem
menu = NSMenu.alloc().init()
menuitem = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_('Preferences', 'launchPreferences:', '')
menu.addItem_(menuitem)
statusItem.setMenu_(menu)

Параметры запуска: метод:

def launchPreferences_(self, notification):
    preferences = Preferences.alloc().initWithWindowNibName_('Preferences')
    preferences.showWindow_(self)

Предпочтения - это класс NSWindowController:

class Preferences(NSWindowController):

Когда я запускаю приложение в XCode (Build & Go), это прекрасно работает. Однако, когда я запускаю встроенный файл .app извне из XCode, statusItem и menuItem появляются, как и ожидалось, но когда я нажимаю на пункт меню Preferences, окно не появляется. Я убедился, что код launchPreferences запущен, проверив вывод консоли.

Далее, если я снова дважды щелкну файл .app, появится окно, но если я удалю активное окно, щелкнув, например, в окне Finder, окно настроек исчезнет. Мне кажется, это как-то связано с активным окном.

Обновление 1 Я пробовал эти два ответа, но ни один из них не работает. Если я добавлю в метод launchPreferences:

preferences.makeKeyAndOrderFront_()

или

preferences.setLevel_(NSNormalWindowLevel)

тогда я просто получаю сообщение об ошибке:

Объект «Настройки» не имеет атрибута

Ответы [ 2 ]

5 голосов
/ 30 сентября 2008

Вам необходимо отправить приложению сообщение activIgnoringOtherApps: и затем отправить окно makeKeyAndOrderFront :.

В Objective-C это будет:

[NSApp activateIgnoringOtherApps:YES];
[[self window] makeKeyAndOrderFront:self];
1 голос
/ 30 сентября 2008

Я не имею представления о PyObjC, никогда не использовал его, но если бы это был код Objective-C, я бы сказал, что вы должны вызвать makeKeyAndOrderFront : для объекта window, если вы хотите, чтобы он стал первое переднее окно. Вновь созданное окно не должно быть ни ключевым, ни передним, если только вы не сделаете это или как в этом случае оба.

Другая проблема, которая беспокоит меня, заключается в том, что вы говорите, что окно исчезает (становится невидимым), когда оно больше не активно. Похоже, ваше окно не является реальным окном. Вы случайно установили его как «Окно служебных программ» в Интерфейсном Разработчике? Не могли бы вы попытаться вручную установить уровень окна, используя setLevel: NSNormalWindowLevel, прежде чем окно будет отображаться на экране в первый раз, исчезает ли оно, когда становится неактивным?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...