代码之家  ›  专栏  ›  技术社区  ›  davidmytton

从statusitem menuitem启动的nswindow不显示为活动窗口

  •  0
  • davidmytton  · 技术社区  · 16 年前

    我有一个用pyobjc编写的statusitem应用程序。statusitem有一个menuitem,当单击它时,该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)
    

    首选项是nswindowcontroller类:

    class Preferences(NSWindowController):
    

    当我在xcode(build&go)中运行应用程序时,这工作正常。但是,当我从Xcode外部运行build.app文件时,statusitem和menuitem会按预期显示,但是当我单击Preferences菜单项时,窗口不会显示。我已经通过检查控制台输出验证了launchpreferences代码正在运行。

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

    更新1 我试过了 these two 答案都不管用。如果我添加到launchPreferences方法:

    preferences.makeKeyAndOrderFront_()
    

    preferences.setLevel_(NSNormalWindowLevel)
    

    然后我得到一个错误:

    “preferences”对象没有属性

    2 回复  |  直到 16 年前
        1
  •  5
  •   Nathan Kinsinger    16 年前

    您需要向应用程序发送ActivateIgnoringOtherApps:消息,然后发送窗口MakeKeyAndOrderFront:。

    在目标C中,这将是:

    [NSApp activateIgnoringOtherApps:YES];
    [[self window] makeKeyAndOrderFront:self];
    
        2
  •  1
  •   Mecki    16 年前

    我不知道PyObjc,从来没有使用过,但是如果这是Objto-C代码,我会说你应该打电话。 makeKeyAndOrderFront :在窗口对象上,如果希望它成为第一个前窗口。新创建的窗口既不需要是键,也不需要是前端,除非您将其设置为键或类似于键和前端。

    另一个让我担心的问题是你说当窗口不再活动时它就会消失(看不见)。听起来你的窗户不是真正的窗户。您是否意外地将其设置为界面生成器中的“实用程序窗口”?在窗口第一次显示在屏幕上之前,您是否可以尝试使用set level:将窗口级别手动设置为nsnormalwindowlevel?当窗口变为非活动状态时,它是否仍会消失?