0

我有一个用 PyObjC 编写的 statusItem 应用程序。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)

launchPreferences: 方法是:

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

Preferences 是一个 NSWindowController 类:

class Preferences(NSWindowController):

当我在 XCode (Build & Go) 中运行应用程序时,它工作正常。但是,当我从 XCode 外部运行构建的 .app 文件时,statusItem 和 menuItem 会按预期显示,但是当我单击 Preferences menuItem 时,窗口不会出现。我已经通过检查控制台输出验证了 launchPreferences 代码正在运行。

此外,如果我再次双击 .app 文件,则会出现该窗口,但如果我通过单击(例如)Finder 窗口来更改活动窗口,则首选项窗口会消失。在我看来,这与活动窗口有关。

更新 1 我已经尝试了 两个答案,但都不起作用。如果我添加到 launchPreferences 方法:

preferences.makeKeyAndOrderFront_()

或者

preferences.setLevel_(NSNormalWindowLevel)

然后我得到一个错误:

“首选项”对象没有属性

4

2 回答 2

5

您需要向应用程序发送一条 activateIgnoringOtherApps: 消息,然后发送窗口 makeKeyAndOrderFront:。

在 Objective-C 中,这将是:

[NSApp activateIgnoringOtherApps:YES];
[[self window] makeKeyAndOrderFront:self];
于 2008-09-30T09:39:54.810 回答
1

我不知道 PyObjC,从未使用过,但如果这是 Objective-C 代码,我会说你应该在窗口对象上调用makeKeyAndOrderFront:如果你想让它成为第一个前窗口。一个新创建的窗口既不能是键,也不能是前面,除非你在这种情况下做它或者像这种情况,两者兼而有之。

另一个让我担心的问题是,当它不再处于活动状态时,您说窗口会消失(变得不可见)。这听起来像你的窗口不是真正的窗口。您是否不小心将其设置为 Interface Builder 中的“实用程序窗口”?你可以尝试手动设置窗口级别,使用 setLevel: 到 NSNormalWindowLevel 在窗口第一次显示在屏幕上之前它是否在变为非活动状态时仍然消失?

于 2008-09-30T09:45:10.227 回答