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

状态栏中的应用程序菜单不适用于雪豹

  •  2
  • psychotik  · 技术社区  · 16 年前

    我有一个应用程序位于Mac的状态栏中。它有一个菜单,可以让你查看应用程序版本,更改一些设置并退出应用程序。

    我在豹身上做的,它在豹身上也很好用。 在雪豹上,我可以在状态栏中看到这个应用程序,点击它可以显示菜单项。但是单击菜单中的项目没有任何作用。这个应用程序没有挂起——它正在做一些它希望做的事情。用户界面线程也没有被挂起——我可以很明显地看到菜单,并且应用程序导致在用户界面线程上显示的对话框(单击菜单时在其中一个线程的外部)显示得很好。在目标为10.6的雪豹上编译它似乎并没有改变这种行为。

    所以我知道这个应用程序能够创建对话框,不会挂起,并且可以正常工作。 我怀疑这与菜单有关,在我的应用程序或雪豹中处理菜单点击。

    其他人对这可能是什么或者我应该去哪里有什么建议吗?我可以在哪里放置一个bp来捕获菜单项单击是否实际发生?

    编辑:我上传了一个简单的repro 10.6xcode项目。如果你能看一眼,我会给你送一瓶虚拟啤酒,如果你发现了什么问题,请告诉我。该应用程序很简单-创建一个状态栏应用程序,其中有一个菜单项“退出”,调用终止应用程序。状态栏应用程序显示,菜单显示,但点击什么也不做。 Here's the project . 它在美洲豹身上运行良好(在建造/运行之前将其全部清除),但在雪豹身上运行不好。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Colin    14 年前

    听起来你的菜单项的动作出口可能没有“连接”到你的代码中的任何东西。从您的描述中我不知道您是在Interface Builder中创建了菜单还是以编程方式创建了菜单,但首先要做的是检查那里。如果您是以编程方式创建菜单,请确保您在@selector()中正确拼写了方法名(如果您收到警告说“[class]可能不会响应-foo”,这是输入错误的一个重要提示)。

    如果连接看起来很好,我会打断设置为您操作的方法,并验证您是否实际调用了您认为是的方法。

    如果是以编程方式设置连接,请中断additemWithTitle:(或等效调用)调用,并确保在跨过该行后立即正确设置nsmenuitem。

    ---编辑---

    在检查了发布的代码之后,它有几个基本的缺陷,其中任何一个都可能导致10.6以下的损坏。

    1. 首先,您会混淆代理在菜单中的角色。委派不应是NSMENU对象,委派应是NSMENUITEM作为“回调”调用以提供自定义逻辑的对象。您根本不需要扩展nsmenu,您的menutesAppDelegate只能从nsObject扩展。

    2. mainmenu.xib文件中菜单对象的类属于menutest类型,但在项目中没有声明menutest类。希望在您设置测试项目时这只是一个复制/粘贴错误,但是您应该检查一下。

    3. 我发现以编程方式设置nsstatustem的菜单要容易得多。试试这个:


    // create the menu
    - (void)createMenu
    {   
        NSMenu* aMenu = [NSMenu new];
        [aMenu setDelegate:self];
    
        NSMenuItem* quitItem = [[NSMenuItem alloc] initWithTitle:@"quitItem"
                               action:@selector(quitSelected:) 
                               keyEquivalent:@""];
    
        [aMenu addItem:quitItem];
        [quitItem release];
    
        NSStatusItem* statusItem = [[NSStatusBar systemStatusBar]
                                   statusItemWithLength:NSVariableStatusItemLength];
    
        NSImage* itemImage = [[NSImage alloc] initWithContentsOfFile:
                             [[NSBundle mainBundle] pathForResource:@"image" ofType:@"png"]];
        NSImage* itemAlternate = [[NSImage alloc] initWithContentsOfFile:
                                 [[NSBundle mainBundle] pathForResource:@"alternate" ofType:@"png"]];
    
        [statusItem setImage:itemImage];
        [statusItem setAlternateImage:itemAlternate];
    
        [statusItem setHighlightMode:YES];
        [statusItem setMenu:aMenu];
    }