我有一个位于Mac状态栏中的应用程序。它有一个菜单,可以让您查看应用程序版本,更改一些设置并退出应用程序。
我在Leopard上构建它,它在Leopard上运行良好。 在Snow Leopard上,我可以在状态栏中看到该应用程序并单击它显示菜单项。但是单击菜单中的项目不会执行任何操作。应用程序没有挂起 - 它正在做它预期会做的事情。 UI线程也没有挂起 - 我可以看到明显的菜单,并且应用程序导致在UI线程上显示的对话框(单击菜单时的那些)显示正常。在针对10.6的Snow Leopard上进行编译似乎并没有改变这种行为。
所以我知道应用程序能够创建对话框,不会挂起并且正在运行。 我怀疑这与菜单有关,并且在我的应用程序或Snow Leopard中处理菜单点击。
其他人对这可能是什么或我应该在哪里提出建议?关于我可以放置BP以捕获菜单项单击是否实际发生的任何建议?
编辑:我上传了一个简单的repro 10.6 XCode项目。如果你能看一眼,我会按照你的方式发送虚拟啤酒,如果你看到了什么错误,请告诉我。该应用程序很简单 - 创建一个状态栏应用程序,其中有一个菜单项“退出”,它在应用程序上调用终止。状态栏应用程序显示,菜单显示但单击不执行任何操作。 Here's the project。它在Leopard上运行良好(在构建/运行之前全部清除)但在Snow Leopard上没有。答案 0 :(得分:1)
听起来您的菜单项的动作插座可能没有“连接”到代码中的任何内容。我不知道你的描述是否在界面构建器中创建了菜单或者是以编程方式创建菜单,但首先要检查的是。确保如果你以编程方式创建菜单,你已经在@selector()中正确拼写了方法名称(如果你有警告说“[class]可能不响应-Foo”这是一个很大的提示输入错字。)
如果连接看起来很好,我会将方法设置为您的操作,并确认您实际上正在调用您认为自己的方法。
如果您以编程方式设置连接,请断开addItemWithTitle :(或等效调用)调用,并确保在单步执行该行后立即正确设置NSMenuItem。
<强> --- --- EDIT 强>
查看已发布的代码后,有几个基本缺陷,其中任何一个都可能导致10.6下的破损。
首先,您会混淆委托与菜单相关的角色。委托不应该是您的NSMenu对象,您的委托应该是由NSMenuItem作为“回调”调用的对象,以提供自定义逻辑。你根本不需要扩展NSMenu,你的MenuTestAppDelegate只能从NSObject扩展。
MainMenu.xib文件中Menu对象的类型为MenuTest类,但您没有在项目中声明的MenuTest类。希望在设置测试项目时这只是一个复制/粘贴错误,但是你应该检查一下。
我发现以编程方式设置NSStatusItem的菜单要容易得多。试试这个:
// 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];
}